Rhino издевается над абстрактным классом без насмешек над его виртуальным методом? - PullRequest
6 голосов
/ 05 августа 2011

Могу ли я выполнить тело виртуального метода, который живет в абстрактном классе, который был смоделирован с помощью Rhino Mocks?

Чтобы было ясно, я не пытаюсь высмеивать поведение виртуального метода. Я пытаюсь / test / виртуальный метод (на осмеянном классе).

Является ли эта идея вопиющим неправильным использованием насмешек носорога?

Ответы [ 2 ]

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

Да, это должно быть абсолютно нормально.Не могу сказать, что попробовал, но я был бы очень удивлен, если бы это не удалось.

РЕДАКТИРОВАТЬ: Я подозреваю, что вы хотите метод PartialMock.Вот пример:

using System;
using Rhino.Mocks;

public abstract class Abstract
{
    public virtual int Foo()
    {
        return Bar() * 2;
    }

    public abstract int Bar();        
}

class Test
{
    static void Main(string[] args)
    {
        MockRepository repository = new MockRepository();
        Abstract mock = repository.PartialMock<Abstract>();

        using (repository.Record())
        {
            Expect.Call(mock.Bar()).Return(5);
        }

        Console.WriteLine(mock.Foo()); // Prints 10
    }
}

РЕДАКТИРОВАТЬ: Или в моей первой попытке AAA:

using System;
using Rhino.Mocks;

public abstract class Abstract
{
    public virtual int Foo()
    {
        return Bar() * 2;
    }

    public abstract int Bar();        
}

class Test
{
    static void Main(string[] args)
    {
        // Arrange
        Abstract mock = MockRepository.GeneratePartialMock<Abstract>();
        mock.Stub(action => action.Bar()).Return(5);

        // Act
        int result = mock.Foo();

        // Assert
        mock.AssertWasCalled(x => x.Bar());
        // And assert that result is 10...
    }
}
1 голос
/ 05 августа 2011

Вы должны указать Rhino.Mocks перезвонить исходной реализации, вместо того, чтобы выполнять ее поведение по умолчанию, просто перехватывая вызов:

var mock = MockRepository.GenerateMock<YourClass>();
mock.Setup(m => m.Foo()).CallOriginalMethod(OriginalCallOptions.NoExpectation);

Теперь вы можете вызывать метод Foo() на вашем mock объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...