2017-09-27 100 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