2

OK - このテストがあります。私の OnSaveCommand はアダプターの Save メソッドをまだ呼び出しているため、失敗することを期待して書きました。しかし、驚いたことに、「呼び出しがモックで複数回実行されました」と言って失敗しました。私は完全に混乱しています。私はそれをまったくゴインクとは呼びません。私の問題は、それが何と呼ばれているかを知る方法がわからないことですか?私がコードを実行している場合、ブレークポイントをスローし、呼び出されたときにコールスタックを確認しますが、もちろんモックであるため、ここでは実際には機能しません。

いくつかのアイデアについて moq クイックスタートを見ようとしましたが、実際には困惑しています。テストの最初の部分では、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());
}

ありがとう!

エイト!おっと - ちょっと!!! 「Times.Once()」を「Times.AtLeastOnec()」に変更しましたが、「モックで呼び出しが実行されませんでした:」と言って失敗した場合は十分確認してください。バグですか?

4

1 に答える 1

0

いくつかのポイントとコメント。

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

2 つの呼び出しの理由を見つける限り、最初に、コード内の適切な場所にブレーク ポイントを設定し、ステップスルーして 2 つの呼び出しを見つけます。それが役に立たない場合は、Moq を手動モックに置き換え、手動モックの SaveDiscounts にブレークポイントを配置します。

幸せなコーディングで、これがお役に立てば幸いです。

于 2012-04-13T22:51:50.243 に答える