[英]AutoFixture with AutoMoq and concrete object injection
我面臨一個與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,而不是您可以在嘲笑的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.