2017-10-25 12 views
1

私は、メソッドが正常に動作するメソッドが呼び出されたかどうかを調べるために、ほとんどの作業ユニットテストを行っています。しかし、私はそのメソッドに渡されるパラメータをチェックしたいと思います。 Verifyを使用する特定の引数セットが渡されているかどうかを調べることができますが、これらが渡されずにテストが失敗した場合、実際に何がメソッドに渡されたかを確認する方法はありますか?Mockに何が渡されたかを確認しますか?

例:私のテストで

sut.Setup(x => x.MyMethod(It.IsAny<myClass>()).Verifiable(); 
sut.Object.DoAThing(); 
sut.Verify(x => x.MyMethod(It.Is<myClass>(v => v.thing == 1))); 

が、これは失敗します(v.thingが1以外のものになります)、しかし私は、v.thingセットはに何がされて知っていただきたいと思いますか?私はこの種のフィードバックが私のコードとユニットテストのデバッグに本当に役立つことを知っています。

私は取得していますエラーが単にx.MyMethodは(それらの期待パラメータを持つ)と呼ばれることはなかったと言っています。

解決策はありますか?明白な何かが欠けている?

最小限の例には、私のポイントを説明します

public class myClass 
{ 
    public struct myStruct { 
     public int thing; 
    } 
    public virtual void MyMethod(myStruct x) 
    { 
     // Code goes here 
    } 
} 

public class sutClass 
{ 
    public myClass target = new myClass(); 
    public void DoAThing() 
    { 
     myClass.myStruct toBePassed = new myClass.myStruct { thing = 8 }; 

     target.MyMethod(toBePassed); 
    } 
} 

[TestMethod] 
public void Test1() 
{ 
    Mock<myClass> mMyClass = new Mock<myClass>(); 
    sutClass sut = new sutClass(); 
    sut.target = mMyClass.Object; 

    mMyClass.Setup(x => x.MyMethod(It.IsAny<myClass.myStruct>())).Verifiable(); 

    sut.DoAThing(); 

    mMyClass.Verify(x => x.MyMethod(It.Is<myClass.myStruct>(v => v.thing == 1))); 
} 

上記の簡単なテストは明らかに失敗を返します。

Expected invocation on the mock at least once, but was never performed: x => x.MyMethod(It.Is<myStruct>(v => v.thing == 1)) 

は私が見たいのは、期待と実際に何が起こったものとの違いは何であったかMyMethodに渡されたものの出力です。多くの場合、Assert.AreEqual(expected, actual)が返されます。 (期待される文字列と実際の文字列など)。

+0

にpassedValueに設定して印刷され、それが不完全であるように、その現在の状態での質問は不明です。 [ask]を読んで、あなたの問題をよりよく理解するために使用できる[mcve]を提供してください。 – Nkosi

+0

サンプルコードを提供するように更新しました。 – Graeme

答えて

2

あなたのモック設定でコールバックを実装できます。ここでは

[TestMethod] 
    public void Test1() 
    { 
     Mock<myClass> mMyClass = new Mock<myClass>(); 
     sutClass sut = new sutClass(); 
     sut.target = mMyClass.Object; 

     int passedValue = 0; 

     mMyClass.Setup(x => x.MyMethod(It.IsAny<myClass.myStruct>())).Callback<myClass.myStruct>((s) => { passedValue = s.thing; Console.Write(s.thing); }); 

     sut.DoAThing(); 

     mMyClass.Verify(x => x.MyMethod(It.Is<myClass.myStruct>(v => v.thing == 1))); 
    } 

値はコンソール

+0

私はそのおかげで仕事をすることができます!私は自分のテストを変更してVerify内の呼び出しをチェックし、あなたの答えを使って、Assert.AreEqualで個別に渡された値をテストしました。これにより、どの値がテストに不合格であるかを知ることができます。 :) – Graeme

関連する問題