문제

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.Object 에서 찾을 수있는 프록시 된 것 대신에 구체적인 TenantProvisioningService가 주입됩니다.

이와 같이 테스트를 다시 작성하면 모든 것이 예상대로 작동합니다 (적어도 :))

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

내 질문이 : 나는 그것을 잘못하고 있어야하는 것인가? 그렇지 않은 경우 자동 픽처가 이렇게 작동하는 이유를 설명하십시오.

도움이 되었습니까?

해결책

as mark seenann 포인트 밖으로, 이것은예상되는 행동.

아래는 원래 게시물 에게 업데이트되었습니다.현재 버전의 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