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()需要一个命令参数,它有一个属性 - 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() 检查传入参数的某些条件。如果它实际上是相同的引用,您可以按照您的第二次验证所做的操作,而是将您的代码更改为以下内容:

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