2016-08-03 5 views
0

Iは部品番号を使用して書かれた以下のクラスとテストクラス有する検証MOQユニットテストメソッドの戻り値

private Mock<testin> _mock; 

[TestInitialize] 
public void Setup() 
{ 
    _mock = new Mock<testin>(); 

} 

[TestMethod] 
public void returngetId() 
{ 

    // Build up our mock object 

    _mock.Setup(x => x.getId(It.IsAny<int>())).Returns(1) 

} 

I関数からを返すよおよびユニットテストケースで値をチェックします。私の理解によると、テストケースは失敗するはずです。しかし、私は成功メッセージを得ています。戻り値を検証する方法はまさに私が期待しているものですか?

答えて

2

現在の設定では、メソッドの実行がスキップされ、代わりに「盲目的に」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")); 
} 

これにより、モック設定が提供されていないメソッドの基本実装が延期されるようになります。

+0

本当に申し訳ありません。私はあなたのポイントを理解できませんでした。私はその質問に混乱があれば避けることができるように、質問を更新しました。私はクラスではなくインターフェイスを模倣している。メソッドを呼び出すインスタンスを使用しています。それは正しいのですか? –

+0

@TomCruise更新された回答を確認してください。まだ助けが必要なら私に知らせてください。 –

+0

2番目のアプローチではエラーが発生しました.Myq.dllで 'System.NotSupportedException'タイプの例外が発生しましたが、ユーザコードでは処理されませんでした。 –

関連する問題