2013-11-15 36 views
3

我正面临一个与AutoFixtureAutoMoqCustomization有关的奇怪问题,以及它如何处理具体类的自动锁定。我怀疑我没有很好地使用它,但想知道有什么问题。首先她的一些背景。比方说,我有我想要测试的类:带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的行为是这样的。

+1

* AutoMoq *忽略具体类,这就是为什么你看到了这种行为:http://blog.ploeh.dk/2010/08/25/ChangingTheAhaviorAutoFixtureAuto-mockingwithMoq IOW,这是预期的。 –

+0

虽然我知道这是预期的是,也击败了最小惊讶的原则? –

+1

我不知道 - 惊喜取决于你的期望......在这种情况下,我认为如果所有*实例突然变成他们类型的模仿,它也会让你大吃一惊......事实上,我是我不确定我能够把握这种行为变化的全部影响......这也是设计它现在的动机因素。 –

回答

6

正如马克·西曼points out,这是预期的行为。

下面是the original post代码更新,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类保持不变。