現在の設定では、メソッドの実行がスキップされ、代わりに「盲目的に」1が返されます。実行するには、メソッドをモックしないでください。セットアップ行を削除すると、テストケースは実際には失敗します。一般に、メソッドを実行しないようにする必要がある場合にのみ、そのメソッドをモックする必要があります。明確にするために
:あなたはgetId
メソッドを呼び出すたびよう
ライン_mock.Setup(x => x.getId(It.IsAny<int>())).Returns(1)
は、代わりにそれを実行するので、値1
が常に返されます、あなたのモックオブジェクトを設定します。だから、次のテストは合格になります。
[TestMethod]
public void returngetId_Always1()
{
// ... Build up our mock object
_mock.Setup(x => x.getId(It.IsAny<int>())).Returns(1);
Assert.AreEqual(1, _mock.Object.getId("foo"));
Assert.AreEqual(1, _mock.Object.getId("bar"));
}
方法の実際の実装は、モックの中から呼び出されるために得るためには、次の構成で、クラスではなくインタフェースを模擬する必要があります。
[TestMethod]
public void returngetId_CallBase()
{
var mock = new Mock<MyTest>() { CallBase = true };
// add other method setups here. DO NOT setup the getId() method.
Assert.AreEqual(2, _mock.Object.getId("foo"));
Assert.AreEqual(2, _mock.Object.getId("bar"));
}
これにより、モック設定が提供されていないメソッドの基本実装が延期されるようになります。
本当に申し訳ありません。私はあなたのポイントを理解できませんでした。私はその質問に混乱があれば避けることができるように、質問を更新しました。私はクラスではなくインターフェイスを模倣している。メソッドを呼び出すインスタンスを使用しています。それは正しいのですか? –
@TomCruise更新された回答を確認してください。まだ助けが必要なら私に知らせてください。 –
2番目のアプローチではエラーが発生しました.Myq.dllで 'System.NotSupportedException'タイプの例外が発生しましたが、ユーザコードでは処理されませんでした。 –