moq 相关问题

Moq(发音为“Mock-you”或只是“Mock”)是.NET的一个模拟框架,它大量使用lambdas和LINQ表达式树。

使用 moq 模拟对 IQueryable 的调用

我正在尝试最小起订量我拥有的存储库,其定义为: 公共 IQueryable GetAll( 表达式> 谓词 = null, 功能 我正在尝试最小起订量我拥有的存储库,其定义为: public IQueryable<TEntity> GetAll( Expression<Func<TEntity, bool>> predicate = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include = null, bool disableTracking = true ) 有办法嘲笑这个吗?我希望使用我提供存储库的模拟数据来执行查询。我不知道如何告诉 MOQ,当我调用 GetAll 时,我希望它仍然运行传入的查询,但针对我提供的数据集执行此操作。所以它不会进入数据库,而是针对我配置的模拟集。我能够创建数据,它包含 12 条记录,但我希望 getall moq 调用来执行其查询并将其过滤为仅应返回的 2 条记录。 调用发生的实际服务是: var list = await _unitOfWork.GetRepository<CASE_ACTIVITY>() .GetAll(predicate: x => x.SM_SITE_ID == siteId && x.CMS_USER_ID == userId && x.IS_DELETED == "N" && x.Appointment.IS_DELETED == "N" && x.Appointment.IS_ARCHIVED == "N" && x.IS_ARCHIVED == "N" && ( (x.Appointment.APPOINTMENT_DATETIME.HasValue && x.Appointment.APPOINTMENT_DATETIME.Value.Date == DateTime.Today.Date) || (!x.Appointment.APPOINTMENT_DATETIME.HasValue && x.ACTIVITY_STATUS_ID == _appSettings.CASE_ACTIVITY_STATUS_ID_PENDING) ) ) .Include(x => x.Activity_Lookup) .Include(x => x.Appointment) .ThenInclude(x => x.Cms_Client) .Include(x => x.Cms_Case) .ToListAsync(); 假设您对 GetRepository() 方法有足够的控制权以使 it 返回您的模拟存储库,则模拟方法本身相当简单(如果有点冗长)。我刚刚将 GetAll 方法转储到名为 IRepository 的接口中,这就是模拟的样子。在 Returns 方法内部,您可以根据需要访问要执行或忽略的每个参数。 var mock = new Moq.Mock<IRepository>(); mock.Setup(a => a.GetAll<int>(It.IsAny<Expression<Func<int, bool>>>(), It.IsAny<Func<IQueryable<int>, IOrderedQueryable<int>>>(), It.IsAny<Func<IQueryable<int>, IIncludableQueryable<int, object>>>(), It.IsAny<bool>())) .Returns<Expression<Func<int, bool>>, Func<IQueryable<int>, IOrderedQueryable<int>>, Func<IQueryable<int>, IIncludableQueryable<int, object>>, bool>((param1, param2, param3, param4) => { return new[] { 1, 2, 3 }.AsQueryable(); }); var result = mock.Object.GetAll<int>(); 从这里开始,如果不看到更多代码,我们就无能为力。不过,从抽象的角度来说,您将把您的 mock.Object (其类型为 IRepository)并将其提供给 GetRepository() 从中提取的任何集合。当然,还要注意,我使用 int 作为通用参数——您可以将其替换为您使用的任何类型。也许可以制作一个接受通用参数的模拟,但希望这不是必需的!

回答 1 投票 0

单元测试:模拟返回 null

我已经在相同的场景下做了很多次,但这次失败了,我无法找出原因,请帮助我。 下面是我的代码,我已经尝试过最小起订量和

回答 1 投票 0

如何对不使用存储库的处理程序进行单元测试?

假设我有一个以这种方式实现的处理程序。没有存储库,逻辑按以下方式编写在处理程序内部。 既然我不应该嘲笑 EF,那怎么会......

回答 1 投票 0

模拟NLog的记录器并读取记录的消息

我使用 NLog 4.5.11 进行日志记录,使用 moq 4.10.1 进行模拟。 我有一个中间件,它使用 NLog 将异常详细信息写入日志文件。 我需要在我的 API 项目中对中间件进行单元测试并检查...

回答 2 投票 0

使用 IServiceProvider.GetRequiredService 对方法进行单元测试会抛出“未注册类型‘<T>’的服务”

我有一个类,它在构造函数中将 IServiceProvider 作为参数,并在 Get() 方法中使用 IServiceProvider.GetRequiredService 返回一个对象。当对这个方法进行单元测试时看看

回答 1 投票 0

使用mockablequery.moq模拟 EF 扩展方法 - 不起作用

我有以下单元测试,需要使用最小起订量模拟 EF 扩展方法 .ToListAsync。由于起订量无法模拟静态方法,并且扩展方法是静态方法,所以我不得不使用...

回答 1 投票 0

如何模拟SendGrid

我正在尝试为我编写的使用 SendGrid 发送电子邮件的方法编写单元测试。 我的方法是这样的: 公共异步任务SendEmail(TemplatedMailMessage emailMessage) { ...

回答 2 投票 0

如何模拟具有大量构造函数参数的 Service?

我继承了一个asp.net web api项目,遵循正常的控制器-->服务-->存储库架构。这个项目没有单元测试,我正在尝试对其进行改造。 典型的

回答 1 投票 0

为什么代码中没有返回这个模拟值

我有一个 dotnet core 6 函数,包含以下几行 var csv = new CsvReader(阅读器, 配置)) var 记录 = csv.GetRecords().ToList(); 我设置模拟来模拟某些对象......

回答 1 投票 0

如何获取 Azure 证书客户端响应和证书指纹

我正在尝试对进行证书验证的服务进行单元测试。它将给定指纹与存储在 Azure Key Vault 中的证书上的指纹进行比较。 我的代码运行良好,但现在我......

回答 1 投票 0

带有可选参数的模拟方法根据可选默认值返回意外的不同值

我模拟了一个接口中的方法,该方法具有返回 true 的可选参数。 但是,根据我是否将所有可选参数传递给调用或仅传递必需的参数,我得到一个

回答 1 投票 0

如何模拟Microsoft Graph API SDK客户端?

我在项目中使用了Microsoft Graph SDK来调用图形API,为此我需要使用GraphServiceClient。 要使用 GraphServiceClient,我必须添加一些辅助类,其中 SDKHelper 是一个...

回答 3 投票 0

带有谓词但不带 It.isany 的模拟

我需要一个帮助来解决.net中的模拟相关问题,我有一个带有以下代码的函数。 任务> GetAllAsync(表达式> 谓词,Func<

回答 2 投票 0

模拟没有接口的内部类

我正在尝试模拟内部类进行单元测试,由于一些循环依赖,我将无法使用此类的接口来模拟它,我还添加了单元测试程序集名称(确保我...

回答 1 投票 0

如何清空?

我的应用程序由C#开发(Microsoft.EntityFrameworkCore,版本6.0.25)。 我使用 Moq(版本 4.20.70)和 NUnit(版本 4.0.1)进行单元测试用例 我尝试了下面的方法来进行空检查, [

回答 2 投票 0

为什么我的受保护方法没有返回我在模拟中设置的内容

为什么我的受保护方法没有返回我在模拟中设置的内容?运行单元测试时,受保护的方法返回 99,但我期望返回 1,因为我在模拟中设置了它。 [测试方法]

回答 1 投票 0

创建WebApplicationFactory后是否可以模拟服务?

我有一个 IntegrationTestHelper 类,我用它来创建一个带有模拟 InMemory 数据库的 WebApplicationFactory。 公共类 IntegrationTestHelper { 公共 WebApplicationFactory 我有一个 IntegrationTestHelper 类,我用它来创建一个带有模拟 InMemory db 的 WebApplicationFactory。 public class IntegrationTestHelper { public WebApplicationFactory<RentAPI.Program> GetWebApplicationFactory(string databaseName) { var factory = new WebApplicationFactory<RentAPI.Program>().WithWebHostBuilder(builder => { builder.ConfigureTestServices(services => { var dbContextDescriptor = services.SingleOrDefault(d => d.ServiceType == typeof(DbContextOptions<ApplicationDbContext>)); services.Remove(dbContextDescriptor); services.AddDbContext<ApplicationDbContext>(options => { options.UseInMemoryDatabase(databaseName); }); }); }); using var scope = factory.Services.CreateScope(); ; var db = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>(); var userManager = scope.ServiceProvider.GetRequiredService<UserManager<User>>(); var roleManager = scope.ServiceProvider.GetRequiredService<RoleManager<IdentityRole>>(); SeedData(userManager, roleManager, db).Wait(); return factory; } ... } 我在下一个测试中使用 GetWebApplicationFactory 来获取 WebApplicationFactory 实例,然后再次使用 WithWebHostBuilder 来模拟 IFileStorageService,但它不起作用。 API 继续使用 Program.cs 中添加的 IFileStorageService 的实现。 public class PropertyControllerTests { private IntegrationTestHelper _helper; private WebApplicationFactory<RentAPI.Program> _factory; private HttpClient _client; [SetUp] public void Setup() { _helper = new IntegrationTestHelper(); _factory = _helper.GetWebApplicationFactory(Guid.NewGuid().ToString()); } #region AddNewProperty [Test] public async Task AddNewProperty_ReturnsOk() { // Arrange _factory.WithWebHostBuilder(builder => { builder.ConfigureTestServices(services => { var fileStorageService = services.SingleOrDefault(d => d.ServiceType == typeof(IFileStorageService)); services.Remove(fileStorageService); var mockedService = new Mock<IFileStorageService>(); mockedService.Setup(_ => _.UploadFilesAsync(It.IsAny<IFormFile[]>())) .ReturnsAsync(new List<string> { "fileId1", "fileId2" }); services.AddScoped(_ => mockedService.Object); }); }); _client = _factory.CreateClient(); ... // creating and setting data in content // Act var response = await _client.PostAsync("property/landlord/add", content); // Assert Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); } [TearDown] public void TearDown() { _client.Dispose(); _factory.Dispose(); } } 但是当我搬家的时候 var fileStorageService = services.SingleOrDefault(d => d.ServiceType == typeof(IFileStorageService)); services.Remove(fileStorageService); var mockedService = new Mock<IFileStorageService>(); mockedService.Setup(_ => _.UploadFilesAsync(It.IsAny<IFormFile[]>())) .ReturnsAsync(new List<string> { "fileId1", "fileId2" }); services.AddScoped(_ => mockedService.Object); 到 GetWebApplicationFactory 一切都开始工作了。看起来像这样 public WebApplicationFactory<RentAPI.Program> GetWebApplicationFactory(string databaseName) { var factory = new WebApplicationFactory<RentAPI.Program>().WithWebHostBuilder(builder => { builder.ConfigureTestServices(services => { var dbContextDescriptor = services.SingleOrDefault(d => d.ServiceType == typeof(DbContextOptions<ApplicationDbContext>)); services.Remove(dbContextDescriptor); services.AddDbContext<ApplicationDbContext>(options => { options.UseInMemoryDatabase(databaseName); }); var fileStorageService = services.SingleOrDefault(d => d.ServiceType == typeof(IFileStorageService)); services.Remove(fileStorageService); var mockedService = new Mock<IFileStorageService>(); mockedService.Setup(_ => _.UploadFilesAsync(It.IsAny<IFormFile[]>())) .ReturnsAsync(new List<string> { "fileId1", "fileId2" }); services.AddScoped(_ => mockedService.Object); }); }); using var scope = factory.Services.CreateScope(); ; var db = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>(); var userManager = scope.ServiceProvider.GetRequiredService<UserManager<User>>(); var roleManager = scope.ServiceProvider.GetRequiredService<RoleManager<IdentityRole>>(); SeedData(userManager, roleManager, db).Wait(); return factory; } 它有效,但对我来说这个实现并不方便。 创建WebApplicationFactory后是否可以模拟服务? 如果您检查WithWebHostBuilderCore,您会看到它返回您完全忽略的WebApplicationFactory<TEntryPoint>。尝试使用它: var newFactory = _factory.WithWebHostBuilder(builder => { //.. }); var client = newFactory.CreateClient(); // I would recommend to avoid assigning to shared fields in the test 至于“原始”_factory - factory.Services(称为种子)将在内部初始化测试服务器,这需要从服务集合构建服务提供者,从注册的角度来看,默认服务提供者基本上是只读的(即,您可以不添加/删除注册)。

回答 1 投票 0

AutoMocker 安装程序无法正常工作

我正在尝试在我的一个项目中使用Moq.Automock,但我以前没有使用过。请看下面的代码: [测试治具] 公共课 BusinessLayerTests { 列表

回答 1 投票 0

使用 Mock 为带有 dot net 6.0 和工作单元的 Web API 项目编写 TDD 测试

我有一个Web API项目,我使用dot net 6.0的工作单元模式并想为其编写测试。 我有一个如下所示的控制器和一个用于身份验证的函数: 公共 AuthController(

回答 1 投票 0

当构造函数有参数时使用 Moq 模拟对象

我有一个对象,我正在尝试使用最小起订量来模拟。该对象的构造函数具有必需的参数: 公共类 CustomerSyncEngine { 公共 CustomerSyncEngine(ILoggingProvider 日志记录提供商, ...

moq
回答 3 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.