2012-04-12 14 views
2

OK - このテストがあります。私は、OnSaveCommandがアダプタのSaveメソッドをまだ呼び出せなかったので、失敗すると思って書きました。しかし、私の驚いたことに、「呼び出しは模擬実験で2回以上実行された」と言わなかった。私は全く混乱している。私は全くそれを呼ばないよgoink。私の問題は、それが何であるかを伝える方法が分からないことです。私がコードを実行している場所でブレークポイントをスローし、コールスタックがコールされたときにそれを見るだけですが、実際にはモックではないので実際には動作しません。Kung fooの呼び出しが複数回ストライキされた場合、どのメソッドをテストから呼び出すかを知る方法は?

私はいくつかのアイデアのためにmoq quickstartを見ようとしましたが、真実はちょうど私が困惑しています。テストの最初の部分では、DiscountsForSelectedCompanyリストに値が設定されるイベントが発行されます。そのすべてが発生することがわかりました。次に、saveコマンドを正しく実行しますか?それから私はエラーを取得します。私が言ったように、私は困惑しています - もし誰かが正しい方向に私を向けることができたらそれはすばらしいでしょう。

[Test] 
public void SaveCommand_Will_Call_Adapter_SaveDiscounts_For_All_Edited_Discounts() 
{ 
    eventAggregator.GetEvent<SetCompanyIdEvent>().Publish(182); 

    vm.DiscountsForSelectedCompany.Single(x => x.Id == 1).IsEdited = true; 
    mockVariablePricingAdapter.Setup(x => x.SaveDiscounts(
      It.Is<List<DisplayCompanyDiscount>>(a => a.First().Id == 1)) 
     ).Verifiable(); 

    vm.SaveCommand.Execute(); 
    mockVariablePricingAdapter.Verify(x => x.SaveDiscounts(It.Is<List<DisplayCompanyDiscount>>(a => a.First().Id == 1)), Times.Once()); 
} 

ありがとう!

EIDT!ホワイト - ねえ!!!私は "Times.Once()"を "Times.AtLeastOnec()"に変更し、 "呼び出しは擬似では実行されませんでした:バグですか?

+1

あなたは 'Kung foo strike multiple times';) – Jakub

+0

[MOQを使って非プリミティブな引数をテストする](http://stackoverflow.com/questions/2245710/using-moq-to-test-メソッド - その - 非 - 非原始引数を受け入れる)あなたの問題を解決する? –

+0

私はそれをTimes.Exactly(1)に変更しました。問題を解決し、正しく動作をテストします。 – Kenn

答えて

0

いくつかの点とコメント。

最後の行で明示的にあなたの確認を識別しているため、最初の3行目のテストは不要です。 .setup(...).verifiable()をそのまま残す場合は、最後の行は.Verify()にする必要があります。

2つのコールの理由を見つけるまでは、まず、コード内の適切な場所にブレーキポイントを設定し、2つのコールを見つけるためにステップスルーします。これが役に立たない場合は、Moqを手動モックで置き換え、手動モックのSaveDiscountsにブレークポイントを設定します。

ハッピーコーディングと私はこれが役に立ちそうです。

関連する問題