AutoFoture与AutoMoq和具体对象注入
我遇到了一个与AutoFixture
和AutoMoqCustomization
相关的奇怪问题,以及它如何处理具体类的自动锁定。 我怀疑我没有很好地使用它,但想知道问题是什么。 首先是她的一些背景。 假设我有一个我想测试的课程:
public class IdentityApplicationService { public IdentityApplicationService( TenantProvisioningService tenantProvisioningService) { // guard clause etc. _tenantProvisioningService = tenantProvisioningService; } }
及其依赖类TenantProvisioningService
(TenantProvisioningService的依赖项在这里不相关,因为它们将被自动模拟,我不关心我的测试):
public class TenantProvisioningService { readonly IRoleRepository _roleRepository; readonly ITenantRepository _tenantRepository; readonly IUserRepository _userRepository; public TenantProvisioningService( ITenantRepository tenantRepository, IUserRepository userRepository, IRoleRepository roleRepository) { this._roleRepository = roleRepository; this._tenantRepository = tenantRepository; this._userRepository = userRepository; } }
这是我的简单测试:
[Fact] public void ShouldReturnTenantWhenCallingProvisionTenant() { var fixture = new Fixture().Customize(new AutoMoqCustomization()); var mockTenantProvisioningService = fixture.Freeze<Mock>(); var sut = fixture.Create(); var command = new ProvisionTenantCommand( "bla", "bla SaaS platform", "superadmin", "superadmin", "admin@bla.bla", null, null, null, null, null, null, null); var tenant = sut.ProvisionTenant(command); // some asserts }
这不起作用,因为当我调用fixture.Create()
然后在它的构造函数中注入一个具体的TenantProvisioningService而不是你可以在mockTenantProvisioningService.Object中找到的代理 。
如果我像这样重写测试(注意夹具注入线)一切都按预期工作(至少我是:))
[Fact] public void ShouldReturnTenantWhenCallingProvisionTenant() { var fixture = new Fixture().Customize(new AutoMoqCustomization()); var mockTenantProvisioningService = fixture.Freeze<Mock>(); fixture.Inject(mockTenantProvisioningService.Object); var sut = fixture.Create(); var command = new ProvisionTenantCommand( "bla", "bla SaaS platform", "superadmin", "superadmin", "admin@bla.bla", null, null, null, null, null, null, null); var tenant = sut.ProvisionTenant(command); // some asserts }
所以我的问题是 :我做错了还是它应该是这样的? 如果没有,请给我解释为什么AutoFixture表现得像这样。
正如Mark Seemann 指出的那样 ,这是预期的行为。
以下是更新的原始post中的代码,以使用当前版本的AutoFixture:
Func concreteFilter = sb => !(sb is MethodInvoker); var relays = new FilteringRelays(concreteFilter); var fixture = new Fixture(relays).Customize( new AutoMoqCustomization( new MockRelay( new TrueRequestSpecification())));
FilteringRelays
类保持不变。
- 如何让Autofixture创建一个包含接口类型属性的类型的实例?
- 需要为ApiControllers创建约定
- Ploeh AutoFixture无法从System.Runtime.Serialization.ExtensionDataObject创建实例
- AutoFixture.AutoMoq为一个构造函数参数提供已知值
- AutoFixture:PropertyData和异构参数
- 如何在NSubstitute中使用AutoFixture的示例
- 使用AutoMoq创建控制器时,Fixture.CreateAnonymous方法使用错误(AutoFixture)杀死测试运行程序进程
- 如何让AutoFixture AutoMoq从实例化对象中的注入服务返回结果?
- 自动锁定Web Api 2控制器