【发布时间】:2012-01-18 18:46:06
【问题描述】:
我有一段代码可能无法更改。理想情况下,我会将 Publish 方法移到另一个类中。模拟将成为一项微不足道的操作,我会很好。这是一个简化的示例。
public class Entity
{
private IController _controller;
// Omitted: Constructor where IController is assigned
public virtual int Process()
{
return Publish(_controller.DoSomeStuff());
}
public virtual int Publish(int val)
{
Console.WriteLine(val); // This is actually a call to an external system.
return val;
}
}
我想做的是调用真正的 Process 方法和模拟的 Publish 方法。 _controller 的值也会被模拟。
我尝试使用最小起订量并做:
var mock = new Mock<IController>();
mock.Setup(m => m.DoSomeStuff()).Returns(11);
var mock2 = new Mock<Entity_Accessor>();
mock2.CallBase = true;
mock2.Setup(a => a.Publish(It.IsAny<int>())).Returns(999);
mock2.Object._controller = mock.Object;
int result = mock2.Object.Process();
Assert.AreEqual(999, result);
当我运行这个测试时,返回值 11 而不是 999。如果我删除 mock2.CallBase = true,整个类都会被模拟,它会为每个函数返回默认值。
是否可以在这种情况下只模拟 Publish 方法,同时保留 Process 的原始实现?
是否可以使用不是 Typemock 或 Justmock 的不同模拟框架来实现上述目标(不确定客户是否会为模拟工具的多个副本买单)?
谢谢!
【问题讨论】:
标签: c# unit-testing moq