使用AutoMoq和混凝土对象注入的自动混合
-
20-12-2019 - |
题
我正面临着一个与...有关的奇怪问题 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,而不是一个可以在 mockTenantProvisioningService.对象.
如果我像这样重写测试(注意夹具注入行),一切都按预期工作(至少由我:))
[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是这样的行为。
解决方案
正如Mark Seemann 指出, ,这是预期的行为。
下面是代码从 原帖 更新为与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
类保持不变。
不隶属于 StackOverflow