Kung foo调用多次打击,如何从测试中知道所谓的方法?

时间:2012-04-12 15:22:55

标签: c# nunit moq

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

我试着看一下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! WHOO - 嘿!!!我将“Times.Once()”更改为“Times.AtLeastOnec()”并且确实如果未能说“未在模拟上执行调用:” - 是否有人知道这一点?这是一个错误吗?

1 个答案:

答案 0 :(得分:0)

几点和评论。

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

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

快乐的编码,我希望这有用。

相关问题