Moq(发音为“Mock-you”或只是“Mock”)是.NET的一个模拟框架,它大量使用lambdas和LINQ表达式树。
创建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(称为种子)将在内部初始化测试服务器,这需要从服务集合构建服务提供者,从注册的角度来看,默认服务提供者基本上是只读的(即,您可以不添加/删除注册)。
我正在尝试在我的一个项目中使用Moq.Automock,但我以前没有使用过。请看下面的代码: [测试治具] 公共课 BusinessLayerTests { 列表
使用 Mock 为带有 dot net 6.0 和工作单元的 Web API 项目编写 TDD 测试
我有一个Web API项目,我使用dot net 6.0的工作单元模式并想为其编写测试。 我有一个如下所示的控制器和一个用于身份验证的函数: 公共 AuthController(
我有一个对象,我正在尝试使用最小起订量来模拟。该对象的构造函数具有必需的参数: 公共类 CustomerSyncEngine { 公共 CustomerSyncEngine(ILoggingProvider 日志记录提供商, ...
模拟`TableClient.QueryAsync()`进行单元测试
我需要测试以下方法: 公共异步任务 GetAsync(字符串partitionKey,字符串rowKey) { var 实体 = new List(); 等待...
我有一个 Moq 对象,我需要返回 4 个不同参数的值。我可以用 4 个不同的语句来完成此操作,但是有没有办法在单个安装语句中实现相同的目的? var 参数Mo...
使用 .Net 6 构建的 API 项目 目前正在为我们的 API 项目编写单元测试。 我刚刚实现了 Moq 框架(第一次)并使用 Setup() 函数来测试异常和......
尝试访问字典中的模拟对象时出现KeyNotFoundException
我的模拟测试抛出 KeyNotFoundException: [事实] 公共无效 MockAssembly_GetTypes_ReturnsMockedTypes() { var mockAssembly = new Mock(); mockAssembly.Setup(a => a.
我正在尝试模拟一个具有在抽象类中实现的通用返回类型的方法。 抽象类代码: 公共抽象类 AbstractRepository 其中 T :类 { 亲...
我是模拟新手,被要求为一个方法构建一些单元测试,到目前为止我所理解的是这个类的一个依赖项(要测试的方法所在的位置)等待一个con.. .
我无法从 BLL/服务层运行单元测试。该测试模拟工作单元,因为它是服务方法的单元测试。因此,uow 模拟有一个 null 存储库属性,该属性失败了...
我在.net core 1.0 rc2中使用Entity Framework 7。这是班级。 公共类ApplicationDbContext:DbContext { 公共ApplicationDbContext(DbContextOptions
使用 xUnit 和 Mock 进行单元测试时,Controller ViewResult 返回空模型集合
当我调试控制器索引方法时,它返回一个空模型,我在哪里犯了错误? 我正在使用 Daniel Cazzulino 的 Moq 和 xUnit 以下是我的控制器代码: 教师控制器: 公共课...
我正在为操作方法 MethodUnderTest 编写单元测试(使用 NUnit 和 MOQ),该方法在内部使用 HttpContext 来执行某些功能。我正在通过调用
如何对基于 Clean Architecture 和 CQRS 的控制器进行单元测试?
我有一个产品 API,我打算通过 xUnit.net 和 Moq 对其进行单元测试。顺便说一句,我对单元测试完全陌生。我看过一些关于通过存储库 patt 进行控制器单元测试的视频...
使用 bUnit 和 Moq 测试使用 Fluxor 的剃刀组件
我在 Blazor 应用程序的一个 razor 组件中使用 Fluxor 进行状态管理,但我不太确定如何设置它以使用 Moq 进行测试。我不能仅仅为学生赋予价值,因为......
我正在尝试对我的 WEB API 项目中的 API 进行单元测试 CRUD 操作。我很难弄清楚如何删除。以下是我的服务; 公共异步任务DeleteCompany(int id) { ...
我有以下具体代码: var allBookedPos =等待_dataService.GetAllBookingsForVendorInAwitingApproval(purchaseOrder.VendorCode); foreach(allBookedPos 中的 var 预订) { // 得到...
我正在使用 Moq 包为我的服务编写单元测试。 我正在嘲笑 HttpMessageHandler 来模拟 HttpClient 但我收到了这个运行时间错误消息 System.InvalidOperationException:处理程序...
总结:我希望能够模拟调用远程服务器的 SOAP Web 方法的请求和响应。我希望能够测试整个请求和响应功能...