首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AutoFixture与AutoMoq与混凝土对象注入

AutoFixture与AutoMoq与混凝土对象注入
EN

Stack Overflow用户
提问于 2013-11-15 14:23:47
回答 1查看 3.2K关注 0票数 3

我面临着一个与AutoFixtureAutoMoqCustomization有关的奇怪问题,以及它如何处理具体类的自动化。我怀疑我并没有很好地使用它,但我想知道问题出在哪里。首先,她是有背景的。假设我有一个要测试的类:

代码语言:javascript
复制
public class IdentityApplicationService
{
    public IdentityApplicationService(
        TenantProvisioningService tenantProvisioningService)
    {
        // guard clause etc.
        _tenantProvisioningService = tenantProvisioningService;
    }
}

它的依赖类TenantProvisioningService (TenantProvisioningService的依赖项在这里不相关,因为它们将被自动模拟,我在测试中并不关心):

代码语言:javascript
复制
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;
    }
}

下面是我的简单测试:

代码语言:javascript
复制
[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

如果我像这样重写这个测试(请注意,夹具注入行),那么一切都按我的预期工作(至少:)

代码语言:javascript
复制
[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是这样的行为。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-15 15:39:45

正如Mark 指出所言,这是人们所期待的行为。

下面是更新后的原来的职位代码,以便使用AutoFixture的当前版本:

代码语言:javascript
复制
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类保持不变。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20003224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档