autofoq 및 콘크리트 오브젝트 주입을 가진 자동 셀러
-
20-12-2019 - |
문제
AutoFixture
및 AutoMoqCustomization
와 관련된 이상한 문제가 있으며 콘크리트 클래스의 자동차를 다루는 방법을 직면 해 있습니다. 나는 그것을 사용하지 않고 그 문제가 무엇인지 알고 싶습니다. 그녀의 첫 번째는 어떤 맥락에서. 내가 시험하고 싶은 수업이 있다고 가정 해 봅시다.
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
클래스는 동일하게 유지됩니다.