Moq部分类似于Rhino Mocks

时间:2011-08-04 20:03:35

标签: unit-testing moq

嗨,我是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());
} 

这甚至不起作用。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

Rhino.Mocks中的部分类将调用基类方法,除非您设置模拟和/或存根。默认情况下,如果您创建模具以专门执行此操作,Moq将仅调用基类方法。这是一个适用于您的示例的示例:

var car = new Mock<Car> {CallBase = true};
car.Object.Register();
car.Verify(c => c.Warrant(), Times.Once());

但是,我会尝试避免这种方法(验证是否调用了特定方法)。相反,您的测试应该只是确保在调用方法后完成了正确的“工作”。如何完成这项工作是该方法的私人实现。

如果您编写的测试可以确保调用某些方法,那么随着时间的推移,您的测试会变得更加脆弱 - 尤其是在您重构性能或其他问题时。