2017-06-19 5 views
3

免責事項を使用して、任意の一般的なパラメータで行われていなかったこと - これはHow to use FakeItEasy to assert a method was not calledがアサートコールがFakeItEasy

説明

と同じ問題ではない私は、IOCコンテナでものを登録するコードの部分を持っています私のテストでFakeItEasyを使用して、登録が確実に行われるようにすることができます。

予期しない呼び出しが行われないようにする方法を工夫しています。

クイックレポ正しいです - - 上記のテストに合格します

public class Foo 
{ 
    private readonly ICustomContainer m_CustomContainer; 

    public Foo(ICustomContainer customContainer) 
    { 
     m_CustomContainer = customContainer; 
    } 

    public void Bar() 
    { 
     m_CustomContainer.Register<IMyInterface, IMyImplementation>(); 
    } 
} 

public interface ICustomContainer 
{ 
    void Register<TInterface, TImplementation>() where TImplementation : TInterface; 
} 

public class UnitTest1 
{ 
    [Fact] 
    public void Test1() 
    { 
     //Arrange 
     ICustomContainer fake = A.Fake<ICustomContainer>(); 
     Foo objectUnderTest = new Foo(fake); 

     //Act 
     objectUnderTest.Bar(); 

     //Assert 
     A.CallTo(() => fake.Register<IMyInterface, IMyImplementation>()).MustHaveHappened(); 
     //A.CallTo(() => fake.Register<???>()).MustNotHaveHappened(); //Any generic parameter apart from <IMyInterface, IMyImplementation> must not have happened 
    } 
} 

(テストクラスのカップルに煮詰め問題は、これが本当の実装ではありません)。将来的に別の登録をBar()に追加する予定だった場合、それはまだ通り過ぎるでしょう - 私のテストは既知のシナリオをテストするだけではあまり良くありません。

私はそう

を達成しようとしていますどのような、私のIOCコンテナですICustomContainerのために上記で定義されたインタフェースを考えると、私は期待だけと呼ばれていることを確認したいと思います。私はすでに

は、TypeMockアイソレータなど、過去に他のモックフレームワークを使用した、私は特定の(予想される)コールが行われない限り、例外をスローするために偽のオブジェクトを設定することができ研究してきた何

。私はFakeItEasyでこれを行うことができるかどうかわかりません。また、TypeMockアイソレータは.NETコアをサポートしていないので、私には良いことではありません。

一般的なパラメータを使用しなかったメソッドがあった場合、メソッドが呼び出された回数をカウントするようにFakeItEasyを取得し、そのメソッドが呼び出されたことを期待します。期待されるコール。それは確かに選択肢ですが、私は、拡張メソッドやラッパーとして、ジェネリックパラメータではなく型パラメータを取るために私のインタフェース上にファサードを作成しなければならないことを意味します。つまり、コンパイル前の時間を失う警告私はジェネリックパラメータの制約を受ける。

実際の質問私は予想外のコールが私は.NETのコア/ FakeItEasyを使用して期待していたもの以外の任意の一般的なパラメータを持つを作っていなかったと主張することができるように私は私のテストを修正するにはどうすればよい

/xUnit?

答えて

3

私は単純すぎるかもしれませんが、Strict Fakeのように聞こえるかもしれません。 1つを作成し、必要な呼び出しを明示的に許可します。

//Arrange 
ICustomContainer fake = A.Fake<ICustomContainer>(x => x.Strict()); 

// allow just the registrations you want to 
A.CallTo(() => fake.Register<IMyInterface, IMyImplementation>()).DoesNothing(); 

Foo objectUnderTest = new Foo(fake); 

//Act 
objectUnderTest.Bar(); 

//Assert 
A.CallTo(() => fake.Register<IMyInterface, IMyImplementation>()).MustHaveHappened(); 
+0

いいえ、あなたはあまり単純化していません。私はあなたがこれを行うことができ、ちょうどそれを試したことを知らなかった、それはまさに私が探しているものに見えます。素晴らしい答え! – Jay

+1

私は助けになってうれしいです。 –

関連する問題