嗨,我是Mocking的新手。
我有一个班级:
public class Car
{
public virtual void Register() {
...
Warrant();
}
public virtual void Warrant() {
...
}
}
我想测试Register
来电Warrant
。使用RhinoMocks我想出了:
[Test]
public void RhinoCarTest() {
var mocks = new Rhino.Mocks.MockRepository();
var car = mocks.PartialMock<Car>();
mocks.ReplayAll();
car.Stub(x => x.Warrant());
car.Register();
car.AssertWasCalled(x => x.Warrant());
}
我甚至不确定这是否正确,但似乎可以完成这项工作。我想在Moq做同样的事情。我似乎找不到部分Moq。
我想出的是:
[Test]
public void MoqCarTest() {
var car = new Mock<Car>();
car.Setup(x => x.Warrant());
car.Object.Register();
car.Verify(x => x.Warrant());
}
这甚至不起作用。有人能指出我正确的方向吗?
答案 0 :(得分:1)
Rhino.Mocks中的部分类将调用基类方法,除非您设置模拟和/或存根。默认情况下,如果您创建模具以专门执行此操作,Moq将仅调用基类方法。这是一个适用于您的示例的示例:
var car = new Mock<Car> {CallBase = true};
car.Object.Register();
car.Verify(c => c.Warrant(), Times.Once());
但是,我会尝试避免这种方法(验证是否调用了特定方法)。相反,您的测试应该只是确保在调用方法后完成了正确的“工作”。如何完成这项工作是该方法的私人实现。
如果您编写的测试可以确保调用某些方法,那么随着时间的推移,您的测试会变得更加脆弱 - 尤其是在您重构性能或其他问题时。