Rhino издевается над абстрактным классом, не издеваясь над его виртуальным методом?

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

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

Является ли эта идея явным злоупотреблением Rhino Mocks?


person lance    schedule 05.08.2011    source источник


Ответы (2)


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

РЕДАКТИРОВАТЬ: Я подозреваю, что вам нужен метод 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...
    }
}
person Jon Skeet    schedule 05.08.2011
comment
Я должен был быть более ясным в вопросе. Я пробовал прямо, но не работает. Я надеялся, что кто-нибудь прольет свет на то, как протестировать виртуальный метод, который живет в абстрактном классе, экземпляр которого был создан с использованием Rhino Mocks. - person lance; 05.08.2011
comment
@lance: Да, было бы полезно, если бы вы сказали это для начала ... Я постараюсь воспроизвести проблему. - person Jon Skeet; 05.08.2011
comment
@lance: Я опубликовал пример, который работает для меня ... вам может быть немного сложнее, если ваш класс не является общедоступным или абстрактные методы не являются общедоступными. Я уверен, что есть способы обойти это - я давно не использовал Rhino. - person Jon Skeet; 05.08.2011
comment
Я использую синтаксис AAA от Rhino Mock, и мне это не удается. Сможете ли вы воспроизвести успех, используя синтаксис AAA? - person lance; 05.08.2011
comment
@lance: Я сам не использовал стиль AAA, но, глядя вокруг, похоже, все должно быть в порядке если вас устраивает поведение заглушки для любых абстрактных методов, вызываемых виртуальным методом, который вы ' повторный звонок. Похоже, у вас гораздо больше опыта с подходом AAA, чем у меня, так что вы, вероятно, находитесь в лучшем месте для экспериментов. - person Jon Skeet; 05.08.2011
comment
@lance: Я собрал по кусочкам и то, как, на мой взгляд, должен выглядеть синтаксис AAA, но он может быть не лучшим ... - person Jon Skeet; 05.08.2011
comment
Вы используете Rhino Mocks 3.6? - person lance; 05.08.2011
comment
@lance: Я только что загрузил последнюю версию Rhino.Mocks, чтобы написать эти примеры. Я не использовал это в гневе уже много лет ... - person Jon Skeet; 05.08.2011
comment
Я только что воспроизвел успех, используя ваш код и Rhino Mocks 3.6 AAA. Rhino Mocks 3.5 AAA ведет себя по-другому для меня, но я доволен решением этой проблемы с помощью обновления. Спасибо за обмен мнениями - вы мне невероятно помогли. - person lance; 05.08.2011

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

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

Теперь вы можете вызвать метод Foo() для своего mock объекта.

person PatrickSteele    schedule 05.08.2011
comment
Я не вижу метод установки при статической генерации макета? - person lance; 05.08.2011
comment
Хммм ... Какую версию Rhino.Mocks вы используете? - person PatrickSteele; 06.08.2011