2016-10-20 6 views
4

Moqを使い始めました。これはとても単純な例です。私のメソッド "string getCode(int someID)"内で使用されている "int smokeTest(int a、int b)"メソッドへの呼び出しを模擬したい。 smokeTestの変数はgetCodeで宣言され、設定されます。問題は、私がgetCodeの中で常に "0"の結果を取得するが、私は "20"という私の定義済みの結果を見たいと思う。私が見つけた唯一の解決策は、メソッドをオーバーロードしてすべての変数を渡すことです。しかし、私がテストしたいメソッドの多くはローカル変数を宣言して使用するため、これをやりたくありません。 Moqを使ってこのメソッドをテストする最良の方法は何ですか?Moqを使って、どうやってローカル変数を使ったメソッドをモックするのですか?

int x = It.IsAny<int>(); 
int y = It.IsAny<int>(); 
_mockDataAccess.Setup(m => m.smokeTest(x, y)).Returns(20); 

ます:

_mockDataAccess.Setup(m => m.smokeTest(It.IsAny<int>(), It.IsAny<int>())).Returns(20); 

私はこれを行うことが判明するMOQソースコードを閲覧したおかげで

// Example A 
public string getCode(int someID) 
{ 
    int x = 5; 
    int y = 5; 
    int z = _dataAccess.smokeTest(x, y); 

    return _dataAccess.getCode(someID); 
} 

// NOTE: Doesn't work as wanted 
[Test] 
public void test_getCode_TestB() 
{ 
    var x = It.IsAny<int>(); 
    var y = It.IsAny<int>(); 

    // NOTE: "20" is not returned, 0 is returned instead because local variables are used 
    _mockDataAccess.Setup(m => m.smokeTest(x, y)).Returns(20); 
    _mockDataAccess.Setup(m => m.getCode(234)).Returns("def345"); 

    var result = _businessLogic.getCode(234); 

    Assert.IsTrue(result == "def345"); 
} 

// Example B 

// NOTE: Workaround - pass in variables 
public string getCode(int someID, int a, int b) 
{ 
    var c = _dataAccess.smokeTest(a, b); 
    return _dataAccess.getCode(someID); 
}  

[Test] 
public void test_getCode_TestC() 
{ 
    var x = It.IsAny<int>(); 
    var y = It.IsAny<int>(); 

    // NOTE: "20" is returned as wanted 
    _mockDataAccess.Setup(m => m.smokeTest(x, y)).Returns(20); 
    _mockDataAccess.Setup(m => m.getCode(234)).Returns("def345"); 

    var result = _businessLogic.getCode(234, x, y); 
    Assert.IsTrue(result == "def345"); 
} 
+0

var yに置き換えてもまだ間違っていますか? – gabba

答えて

4

は、それだけであなたが直接MOQのセットアップにIt.IsAny<int>()を渡した場合に動作しますxとyを0のintの虚偽値とすると、あなたの設定は次のようになります。

_mockDataAccess.Setup(m => m.smokeTest(0, 0)).Returns(20); 

この設定では、パラメータが0と0の場合はmoqに20が返されます。そうでない場合は、0のdeafult値を再び返します。これは作成しようとした動作ではないため、moqセットアップに渡す前にIt.IsAny<int>()をxとyに割り当ててはいけません。

@Robのコメントでは、It.IsAny<T>はmoqの設定に渡すことができる一種のスタブです。設定方法はExpression Treesを使って対処する方法を知っていますが、このメソッドが実際に返す値は常にTこのため、このメソッドを常にmoq setupで直接使用する必要があります。

+0

それは感謝しました! – rob23

+0

@ rob23私は助けることができてうれしいです、私はあなたの情報のための詳細についての私の答えを編集しました。 – YuvShap

+0

これは、mockingライブラリ内のいくつかのトリッキーのためです。 'It.IsAny ()'は単に 'default(T)'を返すスタブです。しかし、式ツリーを 'Setup()'に渡します。これは 'It.IsAny 'は実際にはライブラリによって呼び出されず、単に引数を扱う方法についての指示として使うだけです – Rob

関連する問題