C# Kung-foo调用多次,如何从测试中知道调用该方法的是什么?

C# Kung-foo调用多次,如何从测试中知道调用该方法的是什么?,c#,nunit,moq,C#,Nunit,Moq,好的,我有这个测试。我编写它是希望它会失败,因为我的OnSaveCommand确实调用了我的adapters Save方法。但令我惊讶的是,它没有说“调用在mock上执行了不止一次”。我完全糊涂了。我一点也不叫它goink。我的问题是我不知道该怎么说?如果我在哪里运行代码,我会抛出一个断点,并在调用调用时查看调用堆栈,但这在这里并不起作用,因为这当然是一个模拟 我试着在moq快速入门中寻找一些想法,但事实是我被难倒了。测试的第一部分发布一个事件,该事件导致DiscussionsForSelect

好的,我有这个测试。我编写它是希望它会失败,因为我的OnSaveCommand确实调用了我的adapters Save方法。但令我惊讶的是,它没有说“调用在mock上执行了不止一次”。我完全糊涂了。我一点也不叫它goink。我的问题是我不知道该怎么说?如果我在哪里运行代码,我会抛出一个断点,并在调用调用时查看调用堆栈,但这在这里并不起作用,因为这当然是一个模拟

我试着在moq快速入门中寻找一些想法,但事实是我被难倒了。测试的第一部分发布一个事件,该事件导致DiscussionsForSelectedCompany列表被填充,我可以看到所有发生的情况,然后我执行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());
}
[测试]
public void SaveCommand_将_调用_适配器_savedeployments_以获取所有已编辑的_折扣()
{
eventAggregator.GetEvent().Publish(182);
vm.discussforselectedcompany.Single(x=>x.Id==1).IsEdited=true;
mockVariablePricingAdapter.Setup(x=>x.save折扣)(
It.Is(a=>a.First().Id==1))
).可验证();
vm.SaveCommand.Execute();
mockVariablePricingAdapter.Verify(x=>x.save折扣(It.Is(a=>a.First().Id==1)),Times.Once());
}
谢谢


艾德!哇-嘿!!!我将“Times.Once()”改为“Times.atlestonec()”,如果失败,肯定会说“没有对mock执行调用”:-有人知道这件事吗?是虫子吗

一些观点和评论

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

至于找到两个调用的原因,首先,我会在代码中的适当位置设置一个制动点,然后逐步查找这两个调用。如果这没有帮助,用手动模拟替换Moq,并在手动模拟的保存折扣中设置断点


愉快的编码,我希望这是有帮助的。

一些要点和评论

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

至于找到两个调用的原因,首先,我会在代码中的适当位置设置一个制动点,然后逐步查找这两个调用。如果这没有帮助,用手动模拟替换Moq,并在手动模拟的保存折扣中设置断点

快乐的编码,我希望这对你有帮助。

你让我多次参加了《功夫罢工》;)你的问题解决了吗?我把它改成了Times。正好(1)它解决了问题并测试了行为。你让我多次参加了《功夫打击》;)你的问题解决了吗?我把它改成了Times。正好(1)它解决了问题并测试了行为。