我面临着一个与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<TenantProvisioningService>>();
var sut = fixture.Create<IdentityApplicationService>();
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<IdentityApplicationService>()时,在它的构造函数中注入了一个具体的TenantProvisioningService,而不是在fixture.Create<IdentityApplicationService>()中找到的代理TenantProvisioningService
如果我像这样重写这个测试(请注意,夹具注入行),那么一切都按我的预期工作(至少:)
[Fact]
public void ShouldReturnTenantWhenCallingProvisionTenant()
{
var fixture = new Fixture().Customize(new AutoMoqCustomization());
var mockTenantProvisioningService =
fixture.Freeze<Mock<TenantProvisioningService>>();
fixture.Inject(mockTenantProvisioningService.Object);
var sut = fixture.Create<IdentityApplicationService>();
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是这样的行为。
发布于 2013-11-15 15:39:45
正如Mark 指出所言,这是人们所期待的行为。
下面是更新后的原来的职位代码,以便使用AutoFixture的当前版本:
Func<ISpecimenBuilder, bool> concreteFilter =
sb => !(sb is MethodInvoker);
var relays = new FilteringRelays(concreteFilter);
var fixture = new Fixture(relays).Customize(
new AutoMoqCustomization(
new MockRelay(
new TrueRequestSpecification())));FilteringRelays类保持不变。
https://stackoverflow.com/questions/20003224
复制相似问题