オートモルと具体的なオブジェクトの注射とのオートフィクチャー

StackOverflow https://stackoverflow.com//questions/20003224

  •  20-12-2019
  •  | 
  •  

質問

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
}
.

これは、ConfigratorでConforyorで呼び出すと機能しません。 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",
        "admin@bla.bla",
        null,
        null,
        null,
        null,
        null,
        null,
        null);
    var tenant = sut.ProvisionTenant(command);

    // some asserts
}
.

だから私の質問はです:私はそれを間違ってやっていますか?それはそれがあるべき方法ですか?そうでなければ、オートフィックスがこのように振る舞っている理由を説明してください。

役に立ちましたか?

解決

マークとして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