使用接口和私有方法设计可测试代码

时间:2011-11-10 17:20:09

标签: c# unit-testing mocking

所以我有一个视图模型,它采用了IAdapter的实例吗?当我在视图模型中设置属性时,我在IAdapter中调用了一些方法。这个我可以轻松地moq&测试,我做。这是测试方法。

 [TestMethod]
public void Setting_ExchangePrice_Calls_UpdateExcahngeCosts()
{
  var currentItem = new InventoryItem();
  bool adapterUpdateExchangeCostsWasCalled = false;
  adapterMock.Setup(x => x.CurrentItem).Returns(currentItem);
  adapterMock.Setup(x => x.UpdateExchangeCosts()).Callback(() => adapterUpdateExchangeCostsWasCalled = true);
  vm.Adapter = adapterMock.Object;
  vm.ExchangePrice = 4;
  Assert.IsTrue(adapterUpdateExchangeCostsWasCalled);
}

这是问题,UpdateExchangeCosts()需要调用UpdateExchangePrices() - 它们都将存在于适配器的具体实例中,因此没有任何理由将其公开,这意味着没有任何理由来定义它在接口中导致我们没有在接口中定义私有方法。 Sooooo .....我被困在如何测试以确保调用UpdateExchangeCosts()也调用UpdateExchangePrices?我可以想象一个基于状态的测试,但在很多情况下,UpdateExchangePrices不会更新任何东西(由于各种原因),因此不会有任何更改状态进行测试。

谢谢你,祝你有个美好的一天!

1 个答案:

答案 0 :(得分:1)

如果UpdateExchangeCosts需要调用UpdateExchangePrices,则应在测试特定Adapter类时对其进行测试。在测试任何vm时,它不需要关心(并且不应该关心)它给定Adapter的内容。