gpt4 book ai didi

c# - 带有 AutoMoq 和具体对象注入(inject)的 AutoFixture

转载 作者:行者123 更新时间:2023-11-30 14:31:31 26 4
gpt4 key购买 nike

我正面临一个与 AutoFixture 相关的奇怪问题和 AutoMoqCustomization以及它如何处理具体类的自动模拟。我怀疑我没有很好地使用它,但想知道问题出在哪里。首先是她的一些背景。假设我有一个要测试的类(class):

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>() 时然后在它的构造函数中注入(inject)一个具体的 TenantProvisioningService,而不是您可以在 mockTenantProvisioningService.Object 中找到的代理服务。

如果我像这样重写测试(注意 fixture 注入(inject)行),一切都会按预期工作(至少对我来说 :))

[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 会这样。

最佳答案

作为马克·西曼 points out ,这是预期的行为。

下面是来自 the original post 的代码已更新以使用当前版本的 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 类保持不变。

关于c# - 带有 AutoMoq 和具体对象注入(inject)的 AutoFixture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20003224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com