AutoFixture,xUnit:在构造函数

时间:2017-09-27 06:02:12

标签: c# xunit autofixture xunit2

我正在尝试编写一些测试,我使用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并通过方法构造函数注入服务?

1 个答案:

答案 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,我会不加选择地应用于所有测试。