Moq частичный класс, как в Rhino Mocks - PullRequest
2 голосов
/ 05 августа 2011

Привет, я новичок в издевательстве.

У меня есть класс:

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.

То, что я придумал, было:

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

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

    car.Object.Register();

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

Это даже не работает, хотя. Может ли кто-нибудь указать мне правильное направление?

1 Ответ

1 голос
/ 05 августа 2011

Частичные классы в Rhino.Mocks будут вызывать методы базового класса, если вы не установите Mock и / или заглушку.По умолчанию Moq будет вызывать методы базового класса только в том случае, если вы создадите макет специально для этого.Вот пример, который будет работать для вашего примера:

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

Однако я бы попытался избежать этого подхода (проверяя, что был вызван определенный метод).Вместо этого ваш тест должен просто убедиться, что правильная «работа» была выполнена после вызова метода.То, как выполняется эта работа, является частной реализацией метода.

Если вы пишете тесты, обеспечивающие вызов определенных методов, ваши тесты со временем могут стать более хрупкими, особенно если вы выполняете рефакторинг для оценки производительности или других проблем.

...