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

C# 用接口和私有方法设计可测试代码,c#,unit-testing,mocking,C#,Unit Testing,Mocking,所以我有一个视图模型,它以IAdapter为例,对吗?当我在视图模型中设置属性时,我调用了IAdapter中的某个方法。这一点我可以很容易地进行moq和测试,我做到了。这是测试方法 [TestMethod] public void Setting_ExchangePrice_Calls_UpdateExcahngeCosts() { var currentItem = new InventoryItem(); bool adapterUpdateExchangeCostsWasCall

所以我有一个视图模型,它以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不会更新任何东西(出于各种原因),因此测试时不会有任何更改的状态


谢谢你,祝你度过愉快的一天

如果
UpdateExchangeCosts
需要调用
UpdateExchangePrices
,您应该在测试特定的
适配器
类时进行测试。当测试任何
vm
时,它不需要关心(也不应该关心)它给定的
适配器的功能。

如果
UpdateExchangeCosts
需要调用
UpdateExchangePrices
,那么您应该在测试特定的
适配器
类时测试它。当测试任何
vm
时,它都不需要关心(也不应该关心)给定的
适配器的功能。

是!对,我一看到答案,灯泡就亮了。谢谢。两个答案都是正确的。很明显,我只是被淤泥缠住了,它没有在我的大脑中发出咔哒声。是的!对,我一看到答案,灯泡就亮了。谢谢。两个答案都是正确的。很明显,我只是被淤泥缠住了,它没有在我的大脑中发出咔哒声。