我正在尝试编写一些测试,我使用xUnit.net,Moq,AutoFixture。我需要为我的测试方法注入服务:
[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
并通过方法构造函数注入服务?
答案 0 :(得分:1)
如果您希望将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
,我会不加选择地应用于所有测试。