Kung foo invocations多次出击,如何从测试中知道所谓的方法?
问题描述:
行 - 所以我有这个测试。我写它期待它会失败,因为我的OnSaveCommand确实调用我的适配器Save方法。但令我惊讶的是它没有说“调用在模拟中不止一次”。我完全困惑。我根本不叫它goink。我的问题是我不知道如何说出它是什么?如果我在哪里运行代码,我会抛出一个断点,并在调用堆栈时调用它,但这并不真正起作用,因为这当然是一个模拟。Kung foo invocations多次出击,如何从测试中知道所谓的方法?
我试着看moq quickstart的一些想法,但事实是我只是难住。测试的第一部分发布了一个导致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! WHOO - 嘿!我将“Times.Once()”更改为“Times.AtLeastOnec()”,如果失败,说“调用未在模拟上执行:” - 有人知道吗?这是一个错误吗?
答
有几点意见。
由于您在最后一行中明确标识了您的验证,因此您不必进行第三次测试。如果你想离开.setup(...).verifiable(),那么最后一行应该是.Verify();
至于找到两个电话的原因,首先我会设置一个制动点在您的代码中的适当位置,然后逐步找到两个电话。如果这没有帮助,请用手动模拟代替Moq,并在手动模拟的SaveDiscounts中放置一个断点。
快乐编码,我希望这是有帮助的。
你让我在'功夫罢工多次';) –
Jakub
2012-04-12 15:29:54
[使用MOQ来测试非原始参数](http://*.com/questions/2245710/using-moq-to-test- methods-that-accept-non-primative-arguments)解决你的问题? – 2012-04-12 15:37:27
我将其更改为Times.Exactly(1),它可以解决问题,并按照应有的方式测试行为。 – Kenn 2012-04-12 16:50:03