mocking 相关问题

模拟和伪造是隔离代码或组件的方法,以确保单元测试仅针对可测试的代码单元运行,而不实际使用应用程序的其他组件或依赖项。 Mocking与伪造的不同之处在于可以检查模拟以断言测试结果。

使用 Mockoon 进行硬编码模拟响应

我正在尝试模拟这样的 API, 获取用户/:用户ID 然后使用数据桶创建硬编码(非模板化或伪造)响应。我的数据桶看起来像这样。 [ { “{{urlParam '用户...

回答 2 投票 0

如何在 Mockoon 规则中指定嵌套在数组中的值?

我正在尝试根据以下正文请求中的 value1 在mockoon中模拟不同的响应: { "foo":"酒吧", “记录” : [{ “键1”:“值1”,...

回答 2 投票 0

axios.get.mockResolvedValue() 在 testfile.test.ts (Vue/Vitest) 中被标记为问题

我目前正在将 vitest 集成到我的 Vue 应用程序中。单元测试成功运行。 但是,我收到一条错误消息: '属性“mockResolvedValue”适用于类型“...

回答 3 投票 0

在安装文件中使用库中的 vi.mock()

我正在创建自定义 javascript 库,其内容和测试部分被 Vite 分成两个条目。 // 库/vite.config.ts 从“vite”导入{defineConfig} 从“路径”导入路径 导入 dts

回答 1 投票 0

有哪些关于 C# 的 TDD 以及 Mocks 处理的书

您能否推荐一本关于 C# 单元测试和 TDD 的书,至少对模拟对象进行一些处理? 我看过这个问题,但似乎没有提到嘲笑。

回答 5 投票 0

如何在.Net Core测试中模拟UserManager?

我有以下代码。我正在尝试运行创建用户的测试用例。以下是我到目前为止所尝试的。 公共类 CreateUserCommandHandlerTest { 私人模拟 我有以下代码。我正在尝试运行创建用户的测试用例。以下是我到目前为止所尝试的。 public class CreateUserCommandHandlerTest { private Mock<UserManager<ApplicationUser>> _userManager; private CreateUserCommandHandler _systemUnderTest; public CreateUserCommandHandlerTest() { _userManager = MockUserManager.GetUserManager<ApplicationUser>(); var user = new ApplicationUser() { UserName = "ancon1", Email = "[email protected]", RoleType = RoleTypes.Anonymous }; _userManager .Setup(u => u.CreateAsync(user, "ancon2")).ReturnsAsync(IdentityResult.Success); _systemUnderTest = new CreateUserCommandHandler(_userManager.Object); } [Fact] public async void Handle_GivenValidInput_ReturnsCreatedResponse() { var command = new CreateUserCommand { Username = "ancon1", Email = "[email protected]", Password = "ancon2", RoleType = RoleTypes.Anonymous }; var result = await _systemUnderTest.Handle(command, default(CancellationToken)); Assert.NotNull(result); Assert.IsType<Application.Commands.CreatedResponse>(result); } } 我的用户经理在这里: public static class MockUserManager { public static Mock<UserManager<TUser>> GetUserManager<TUser>() where TUser : class { var store = new Mock<IUserStore<TUser>>(); var passwordHasher = new Mock<IPasswordHasher<TUser>>(); IList<IUserValidator<TUser>> userValidators = new List<IUserValidator<TUser>> { new UserValidator<TUser>() }; IList<IPasswordValidator<TUser>> passwordValidators = new List<IPasswordValidator<TUser>> { new PasswordValidator<TUser>() }; userValidators.Add(new UserValidator<TUser>()); passwordValidators.Add(new PasswordValidator<TUser>()); var userManager = new Mock<UserManager<TUser>>(store.Object, null, passwordHasher.Object, userValidators, passwordValidators, null, null, null, null); return userManager; } } 我的命令处理程序是这样的: public class CreateUserCommandHandler : IRequestHandler<CreateUserCommand, BaseCommandResponse> { private readonly UserManager<ApplicationUser> _userManager; public CreateUserCommandHandler(UserManager<ApplicationUser> userManager) { _userManager = userManager; } public async Task<BaseCommandResponse> Handle(CreateUserCommand createUserCommand, CancellationToken cancellationToken) { var user = new ApplicationUser { UserName = createUserCommand.Username, Email = createUserCommand.Email, RoleType = createUserCommand.RoleType }; var result = await _userManager.CreateAsync(user, createUserCommand.Password); if (result.Succeeded) { return new CreatedResponse(); } ErrorResponse errorResponse = new ErrorResponse(result.Errors.Select(e => e.Description).First()); return errorResponse; } } 当我运行测试时,它失败并显示对象引用未设置为对象的瞬间。 我在这里做错了什么?? 我知道这已经有几个月了,但我一直回到这个话题。我将扩展我自己关于这个主题的答案,因为仅仅指向 Haok 的 GitHub 示例就像在说:“读一本书”,因为它很大。它没有指出问题以及您需要做什么。您需要隔离一个 Mock 对象,但不仅如此,您还需要“设置”“CreateAsync”方法。所以让我们把它分成三个部分: 如果您使用 MOQ 或类似的框架来模拟创建 UserManager,则需要 MOCK。 您需要设置您希望从中获取结果的 UserManager 方法。 您可能希望从模拟的 Entity Framework Core 2.1 或类似版本中注入一些通用列表,以便您可以实际看到 IDentity 用户列表实际增加或减少。不仅仅是 UserManager 成功了,其他什么都没有 所以说我有一个返回模拟 UserManager 的辅助方法。与 Haok 代码略有不同: public static Mock<UserManager<TUser>> MockUserManager<TUser>(List<TUser> ls) where TUser : class { var store = new Mock<IUserStore<TUser>>(); var mgr = new Mock<UserManager<TUser>>(store.Object, null, null, null, null, null, null, null, null); mgr.Object.UserValidators.Add(new UserValidator<TUser>()); mgr.Object.PasswordValidators.Add(new PasswordValidator<TUser>()); mgr.Setup(x => x.DeleteAsync(It.IsAny<TUser>())).ReturnsAsync(IdentityResult.Success); mgr.Setup(x => x.CreateAsync(It.IsAny<TUser>(), It.IsAny<string>())).ReturnsAsync(IdentityResult.Success).Callback<TUser, string>((x, y) => ls.Add(x)); mgr.Setup(x => x.UpdateAsync(It.IsAny<TUser>())).ReturnsAsync(IdentityResult.Success); return mgr; } 关键是我正在注入一个通用的“TUser”,这也是我将要测试的内容,并注入一个列表。类似于我的例子: private List<ApplicationUser> _users = new List<ApplicationUser> { new ApplicationUser("User1", "[email protected]") { Id = 1 }, new ApplicationUser("User2", "[email protected]") { Id = 2 } }; ... private _userManager = MockUserManager<ApplicationUser>(_users).Object; 最后我正在使用类似于我要测试的实现的存储库来测试模式: public async Task<int> CreateUser(ApplicationUser user, string password) => (await _userManager.CreateAsync(user, password)).Succeeded ? user.Id : -1; 我这样测试: [Fact] public async Task CreateAUser() { var newUser = new ApplicationUser("NewUser", "[email protected]"); var password = "P@ssw0rd!"; var result = await CreateUser(newUser, password); Assert.Equal(3, _users.Count); } 我所做的关键是,我不仅“设置”了 CreateAsync,而且提供了一个回调,这样我实际上可以看到我注入的列表增加了。希望这对某人有帮助。 aspnet/Identity 是开源的,所以你能做的就是看看他们自己如何模拟它。 他们是这样做的:MockHelpers.cs 测试用户管理器 public static UserManager<TUser> TestUserManager<TUser>(IUserStore<TUser> store = null) where TUser : class { store = store ?? new Mock<IUserStore<TUser>>().Object; var options = new Mock<IOptions<IdentityOptions>>(); var idOptions = new IdentityOptions(); idOptions.Lockout.AllowedForNewUsers = false; options.Setup(o => o.Value).Returns(idOptions); var userValidators = new List<IUserValidator<TUser>>(); var validator = new Mock<IUserValidator<TUser>>(); userValidators.Add(validator.Object); var pwdValidators = new List<PasswordValidator<TUser>>(); pwdValidators.Add(new PasswordValidator<TUser>()); var userManager = new UserManager<TUser>(store, options.Object, new PasswordHasher<TUser>(), userValidators, pwdValidators, new UpperInvariantLookupNormalizer(), new IdentityErrorDescriber(), null, new Mock<ILogger<UserManager<TUser>>>().Object); validator.Setup(v => v.ValidateAsync(userManager, It.IsAny<TUser>())) .Returns(Task.FromResult(IdentityResult.Success)).Verifiable(); return userManager; } 在 .NetCore 2.2 中,您必须做一些稍微不同的事情。将其视为@Nick Chapsas 答案的更新。 首先,你必须使用IUserPasswordStore而不是IUserStore。 IUserPasswordStore继承了IUserStore,但是UserManager想要获取IUserPasswordStore。换句话说,有些事情就行不通了。 如果您想测试 UserManager 的真实行为(例如 CreateUserAsync),您可以使用 UserValidator 和 PasswordValidator 的真实实现。您可能只是想确保您的方法对 CreateUser 错误做出应有的反应。 这是我更新的示例: UserManager<TUser> CreateUserManager() where TUser : class { Mock<IUserPasswordStore<TUser>> userPasswordStore = new Mock<IUserPasswordStore<TUser>>(); userPasswordStore.Setup(s => s.CreateAsync(It.IsAny<TUser>(), It.IsAny<CancellationToken>())) .Returns(Task.FromResult(IdentityResult.Success)); var options = new Mock<IOptions<IdentityOptions>>(); var idOptions = new IdentityOptions(); //this should be keep in sync with settings in ConfigureIdentity in WebApi -> Startup.cs idOptions.Lockout.AllowedForNewUsers = false; idOptions.Password.RequireDigit = true; idOptions.Password.RequireLowercase = true; idOptions.Password.RequireNonAlphanumeric = true; idOptions.Password.RequireUppercase = true; idOptions.Password.RequiredLength = 8; idOptions.Password.RequiredUniqueChars = 1; idOptions.SignIn.RequireConfirmedEmail = false; // Lockout settings. idOptions.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5); idOptions.Lockout.MaxFailedAccessAttempts = 5; idOptions.Lockout.AllowedForNewUsers = true; options.Setup(o => o.Value).Returns(idOptions); var userValidators = new List<IUserValidator<TUser>>(); UserValidator<TUser> validator = new UserValidator<TUser>(); userValidators.Add(validator); var passValidator = new PasswordValidator<TUser>(); var pwdValidators = new List<IPasswordValidator<TUser>>(); pwdValidators.Add(passValidator); var userManager = new UserManager<TUser>(userPasswordStore.Object, options.Object, new PasswordHasher<TUser>(), userValidators, pwdValidators, new UpperInvariantLookupNormalizer(), new IdentityErrorDescriber(), null, new Mock<ILogger<UserManager<TUser>>>().Object); return userManager; } 请注意,如果您想从 UserManager 测试 CreateAsync,则应模拟 UserPasswordStore 有一个方法 (CreateAsync)。 密码和锁定设置取自我的项目。它们应该与您的设置保持同步,以便您可以测试真实的东西。 当然你不会测试例如PasswordValidator,但你可以测试你的方法,例如: //Part of user service public async Task<IdentityResult> Register(UserDto data) { SystemUser user = ConvertDtoToUser(data); IdentityResult result = userManager.CreateAsync(user, data.Password); //some more code that is dependent on the result }

回答 3 投票 0

Python 中的模拟函数参数

假设我有这个功能 从日期时间导入日期 def get_next_friday(base_date=date.today()): 下一个星期五 = ... 返回 next_friday 然后我有一个 celery 任务来调用这个函数......

回答 3 投票 0

如何模拟 javascipt new Date 以从浏览器控制台返回不同的日期

我使用的一个网站在不同日期显示不同的内容。在 JavaScript 中,它使用 new Date() 来确定当前日期,并使用当前日期来确定要显示的内容。 如果我

回答 4 投票 0

用 TypeScript 开玩笑地模拟类依赖关系

我已经阅读了 Mock dependency in Jest with TypeScript、Typescript and Jest:避免模拟函数上的类型错误以及 Stack Overflow 上的许多其他文章,但是虽然我可以让这段代码正常工作...

回答 1 投票 0

Pytest 模拟和单元测试模拟

我是Python新手,最近我发现从Python 3.3开始,如果我没记错的话,unittest是标准测试框架。 我正在开发一个使用 Pytest 和 pytest-mock 插件的项目...

回答 1 投票 0

在 Kotlin 中使用 EasyMock 时,anyObject() 不得为 null

我正在使用 EasyMock 和 Kotlin。我尝试模拟一个示例类。 我不断收到的问题是,任何对象,无论有没有特定的类,都会抛出

回答 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

在测试类中模拟builtins.open会导致pytz出现问题

我发现自己无法在类中模拟打开文件,然后调用 pytz 来设置时区,因为 pytz 还需要执行文件打开操作,并且最终也收到模拟。一个

回答 2 投票 0

函数内部调用函数,无法通过 kotlin mockito 验证

我们需要验证函数 getTree() 在 getFish() 内部被调用了多少次。 但库无法识别函数调用 需要但未调用:factory.getTree(); 导入 org.junit.jupiter.api.Test

回答 1 投票 0

如何使用 Mockito 来模拟受保护的方法?

我使用的是Mockito 1.9.5。我如何模拟受保护方法返回的内容?我有这个受保护的方法... protected JSONObject myMethod(最终字符串参数1,最终字符串参数2) { …… }

回答 8 投票 0

在我的 React 应用程序中使用 Zustand 等库来实现测试设置很困难。 ReferenceError:本地存储未定义

我正在尝试为我的 React 应用程序实现一组测试。所以我要做的第一件事就是实现一些模拟,比如身份验证、localStorage 等。我创建了一个 localStorageMo...

回答 1 投票 0

如何使用模拟将一个方法替换为不同的方法

#实际代码 X 类: def 函数(自身): print("实际函数") def other_func(self): print("别碰我!") # 测试方法 类模拟X(): def func(self):...

回答 2 投票 0

Python 单元测试断言尝试将模拟与字符串进行比较失败

我正在尝试学习如何使用 pytest 和模拟进行单元测试。我有一个非常简单的用例: 从 simple_salesforce 导入 Salesforce 从unittest.mock导入Mock SFClient 类: 定义 __...

回答 1 投票 0

Pester Mock PowerShell 类函数中的命令

我发现了很多有关在 PowerShell 类中模拟函数(方法)的问题。我的问题(并且无法找到答案)是,是否可以模拟包含...的 cmdlet 调用?

回答 1 投票 0

如何模拟/创建 ReqData 来测试 actix Web 请求处理程序?

我正在尝试对使用中间件将数据传递到其中的请求处理程序进行单元测试。在实现中间件测试相当简单之前,我可以使用 web::Data::new(data) 来传递...

回答 1 投票 0

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