簡體   English   中英

具有AutoMoq和混凝土對象注入的AutoFixture

[英]AutoFixture with AutoMoq and concrete object injection

我面臨一個與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,而不是您可以在嘲笑的ProtantantProvisioningService.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",
        "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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM