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");
}
var yに置き換えてもまだ間違っていますか? – gabba