2

好的 - 所以我有这个测试。我写它时期望它会失败,因为我的 OnSaveCommand 确实调用了我的适配器 Save 方法。但令我惊讶的是,它没有说“在模拟中多次执行调用”。我完全糊涂了。我根本不叫它goink。我的问题是我不知道如何分辨它叫什么?如果我在哪里运行代码,我会在一个断点处抛出一个断点,并在调用它时查看调用堆栈,但这在这里并不真正起作用,因为它当然是一个模拟。

我试图查看最小起订量快速入门以获得一些想法,但事实是我只是被难住了。测试的第一部分发布了一个导致 DiscountsForSelectedCompany 列表被填充的事件,我可以看到所有发生的事情,然后我执行保存命令对吗?然后我得到错误。就像我说的那样,我很难过——如果有人能指出我正确的方向,那就太棒了。

[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()”,如果失败说“没有在模拟上执行调用:” - 有人知道吗?它是一个错误吗?

4

1 回答 1

0

几点和评论。

首先,您的测试的第三行是不必要的,因为您在最后一行明确识别您的验证。如果您想保留 .setup(...).verifiable() ,那么最后一行应该是 .Verify();

至于找到两个调用的原因,首先我会在代码中的适当位置设置一个刹车点,然后逐步找到这两个调用。如果这没有帮助,请将 Moq 替换为手动模拟,并在手动模拟的 SaveDiscounts 中放置一个断点。

快乐的编码,我希望这会有所帮助。

于 2012-04-13T22:51:50.243 回答