3

次のテストケースがあります。

    [Test]
    public void MarkAsSuccessfulTest()
    {
        //setup data
        var payment = Util.DbUtil.CreateNewRecurringProfilePayment();

        //unit test

        var mockNotificationSender = new Mock<IMarkAsSuccessfulNotificationSender>();
        var mockCommandHandler = new Mock<IDbCommandHandler<RecurringPaymentMarkAsSuccessfulCommand>>();

        var classUnderTest = new RecurringProfileMarkLastPaymentAsSuccessful(mockCommandHandler.Object, mockNotificationSender.Object);

        classUnderTest.MarkAsSuccessful(payment.RecurringProfile);
        mockCommandHandler.Verify(x=>x.Handle(It.IsAny<RecurringPaymentMarkAsSuccessfulCommand>()), Times.Once());
        mockNotificationSender.Verify(x=>x.SendNotification(payment), Times.Once());

    }

問題は次の行にあります。

mockCommandHandler.Verify(x=>x.Handle(It.IsAny<RecurringPaymentMarkAsSuccessfulCommand>()), Times.Once())

これにより、.Handle()メソッドが呼び出されたことが確認されます。ただし、これはテストには十分ではありません - これ.Handle()は、1 つのプロパティを持つコマンド パラメーターを取ります - Payment。このパラメーターが実際に変数と一致していることを確認したいと思いpaymentます。

これは可能ですか、それともコード設計の一部に問題がありますか?

4

2 に答える 2

3

パラメータ検証の述語を提供できます。

mockCommandHandler.Verify(x => 
   x.Handle(It.Is<RecurringPaymentMarkAsSuccessfulCommand>(c => c.Payment == payment))
   , Times.Once());
于 2012-10-18T18:36:09.387 に答える
0

It.IsAny()を使用しています。It.Is()...は次のように使用できます。

mockCommandHandler.Verify(x => x.Handle(It.Is<RecurringPaymentMarkAsSuccessfulCommand>(command => command.Payment == payment)), Times.Once());

It.Is()を使用して、渡される引数の特定の条件を確認できます。文字通り同じ参照である場合は、2番目の検証で行っていることに従うだけで、代わりにコードを次のように変更できます。

mockCommandHandler.Verify(x => x.Handle(payment), Times.Once());
于 2012-10-18T18:35:26.563 に答える