2017-09-27 99 views
1

我想写一些测试,我使用xUnit.net,Moq,AutoFixture。我需要注入的服务,我的测试方法:AutoFixture,xUnit:安装TypeRelays和注入服务构造函数

[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

如果你想使用MyServiceIService,那么你不需要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); 
} 

如果你想自动完成这个,你可以先在ICustomization封装TypeRelay

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,我不加区别地应用于所有测试。

+0

看起来我需要,谢谢。 – user348173