我正面临着一个与...有关的奇怪问题 AutoFixtureAutoMoqCustomization 以及它如何处理混凝土类的自动化。我怀疑我没有很好地使用它,但想知道有什么问题。首先,她是一些背景。比方说,我有一个类,我想测试 :

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 类保持不变。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top