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

+1

你让我在'功夫罢工多次';) – Jakub 2012-04-12 15:29:54

+0

[使用MOQ来测试非原始参数](http://*.com/questions/2245710/using-moq-to-test- methods-that-accept-non-primative-arguments)解决你的问题? – 2012-04-12 15:37:27

+0

我将其更改为Times.Exactly(1),它可以解决问题,并按照应有的方式测试行为。 – Kenn 2012-04-12 16:50:03

有几点意见。

由于您在最后一行中明确标识了您的验证,因此您不必进行第三次测试。如果你想离开.setup(...).verifiable(),那么最后一行应该是.Verify();

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

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