我正面临一个与AutoFixture
和AutoMoqCustomization
有关的奇怪问题,以及它如何处理具体类的自动锁定。我怀疑我没有很好地使用它,但想知道有什么问题。首先她的一些背景。比方说,我有我想要测试的类:带AutoMoq和混凝土物体注入的AutoFixture
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",
"[email protected]",
null,
null,
null,
null,
null,
null,
null);
var tenant = sut.ProvisionTenant(command);
// some asserts
}
这不起作用,因为当我打电话fixture.Create<IdentityApplicationService>()
然后在它的constructo具体TenantProvisioningService被注入,而不是被代理的,你可以在mockTenantProvisioningService.Object中找到。
如果我重写这样的测试(注意灯具注射线)一切正常(由我至少:))
[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",
"[email protected]",
null,
null,
null,
null,
null,
null,
null);
var tenant = sut.ProvisionTenant(command);
// some asserts
}
所以我的问题是:我是不是做错了或它应该是这样吗?如果不是,请给我解释为什么AutoFixture的行为是这样的。
* AutoMoq *忽略具体类,这就是为什么你看到了这种行为:http://blog.ploeh.dk/2010/08/25/ChangingTheAhaviorAutoFixtureAuto-mockingwithMoq IOW,这是预期的。 –
虽然我知道这是预期的是,也击败了最小惊讶的原则? –
我不知道 - 惊喜取决于你的期望......在这种情况下,我认为如果所有*实例突然变成他们类型的模仿,它也会让你大吃一惊......事实上,我是我不确定我能够把握这种行为变化的全部影响......这也是设计它现在的动机因素。 –