gpt4 book ai didi

c# - 自动夹具,xUnit : Setup TypeRelays and inject service in constructor

转载 作者:行者123 更新时间:2023-12-05 04:09:13 25 4
gpt4 key购买 nike

我正在尝试编写一些测试,我使用 xUnit.net、Moq、AutoFixture。我需要向我的测试方法注入(inject)服务:

[Theory, AutoData]
public void TestSmthCool(IService service)
{
}

IService 有 3 个我想模拟的依赖项。但是,如果我运行测试,我会得到错误:

AutoFixture was unable to create an instance from Services.Interfaces.IService because it's an interface.

所以,我通过以下方式修复了它:

[Theory, AutoData]
public void TestSmthCool()
{
var fixture = new Fixture();
fixture.Customize(new AutoMoqCustomization());
fixture.Customizations.Add(
new TypeRelay(
typeof(IService),
typeof(MyService)
)
);

var s= fixture.Create<IService>();
}

但是,如何为所有测试设置 TypeRelay 并通过方法构造函数注入(inject)服务?

最佳答案

如果您希望将MyService 用于IService,那么您不需要AutoMoqCustomization;即这个测试通过:

[Fact]
public void TestSmthCool()
{
var fixture = new Fixture();
fixture.Customizations.Add(
new TypeRelay(
typeof(IService),
typeof(MyService)
)
);

var s = fixture.Create<IService>();

Assert.IsAssignableFrom<MyService>(s);
}

如果你想自动化这个,你可以先将 TypeRelay 打包到一个 ICustomization 中:

public class MyServiceCustomization : ICustomization
{
public void Customize(IFixture fixture)
{
fixture.Customizations.Add(
new TypeRelay(
typeof(IService),
typeof(MyService)));
}
}

然后创建一个派生自 AutoDataAttribute 的属性:

public class MyServiceAutoDataAttribute : AutoDataAttribute
{
public MyServiceAutoDataAttribute() :
base(new Fixture().Customize(new MyServiceCustomization()))
{
}
}

然后您可以在所有测试中使用它:

[Theory, MyServiceAutoData]
public void CustomizedAutoDataBasedTest(IService s)
{
Assert.IsAssignableFrom<MyService>(s);
}

一般来说,我倾向于创建一个代码库范围的 CompositeCustomization,我不加区别地应用于所有测试。

关于c# - 自动夹具,xUnit : Setup TypeRelays and inject service in constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46440512/

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