2017-09-27 5 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); 
} 

あなたがこれを自動化したい場合は、あなたが最初ICustomizationTypeRelayをパッケージ化することができます

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())) 
    { 
    } 
} 

これですべてのテストでこれを使用できます:

一般に、すべてのテストに無差別に適用するコードベースのコードCompositeCustomizationを作成する傾向があります。

+0

私は必要があるように見える、ありがとう。 – user348173

関連する問題