AnonyMouse
AnonyMouse

Reputation: 18640

Moq partial class like in Rhino Mocks

Hi I'm new to Mocking.

I have a class:

public class Car
{
    public virtual void Register() {
        ...
        Warrant();
    }

    public virtual void Warrant() {
        ...
    }
}

I was wanting to test that Register calls Warrant. Using RhinoMocks I came up with:

[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());
}

I'm not even sure if this is correct but it seemed to do the job. I was wanting to do the same thing in Moq. I couldn't seem to find a partial Moq.

What I came up with was:

[Test]
public void MoqCarTest() {
    var car = new Mock<Car>();

    car.Setup(x => x.Warrant());

    car.Object.Register();

    car.Verify(x => x.Warrant());
} 

This doesn't even work though. Can someone point me in the right direction?

Upvotes: 2

Views: 1628

Answers (1)

PatrickSteele
PatrickSteele

Reputation: 14677

Partial classes in Rhino.Mocks will call the base class methods unless you set up a Mock and/or stub. By default, Moq will only call base class methods if you create the mock to specifically do that. Here's an example that will work for your example:

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

However, I would try and avoid this approach (verifying that a specific method was called). Instead, your test should simply ensure that the correct "work" was done after calling the method. How that work gets done is a private implementation of the method.

If you write tests that ensure certain methods are called, your tests can become more brittle over time -- especially as you refactor for performance or other issues.

Upvotes: 1

Related Questions