помощь в тестировании абстрактного метода с использованием носорогов - PullRequest
0 голосов
/ 11 декабря 2011

Я хочу написать несколько тестов для моего класса c #.У меня есть базовый класс с именем BaseClass, который имеет абстрактный метод с именем Execute, а также метод с именем Redirect.У меня есть класс с именем Class1, который наследует BaseClass и реализует абстрагированный метод Execute, метод, который я хочу протестировать.Следующий код объясняет настройку далее:

public abstract class BaseClass
{
    public abstract void Execute();

    public void Redirect()
    {
        // redirect code here
    }
}

public class Class1 : BaseClass
{
    public void Execute()
    {
      // do some processing

      this.Redirect();
    }
}

Я работаю с mstest и использую насмешки на носорогов для своей насмешкиЯ хочу написать тесты для метода Execute, чтобы проверить, работает ли он, как я ожидаю.

Как видно из приведенного выше, метод Execute вызывает базовый метод Redirect, поэтому я ожидаю, что метод Redirect будет вызван.

Я использую макет репозитория Rhino mocks для создания частичного макета Class1.Созданный макет содержит замечательный метод Execute, но не содержит ссылку на метод Redirect, который находится в Class1.Я хочу иметь возможность установить ожидание в смоделированном репозитории при вызове метода Redirect.

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

Ответы [ 2 ]

2 голосов
/ 11 декабря 2011

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

По этой причине, пожалуйста, рассмотрите возможность делегирования этого поведения взаимодействующему классу, а затемполностью исключить этот класс.

Например, если бы метод execute сохранял сущность в базе данных, я бы создал хранилище, вставил в него зависимость-зависимость через конструктор, а затем попросил хранилище сохранить мойюридическое лицо.Затем весь сотрудничающий класс может быть смоделирован с использованием стандартных методов.

В настоящий момент кажется, что ваш класс несет ответственность за слишком многое, поэтому у вас возникают проблемы.Моды работают очень эффективно, когда они используются для выражения совместной работы, что позволяет нам создавать классы с едиными обязанностями, что позволяет нам создавать хорошо разработанный и поддерживаемый код.Я рекомендую книгу Стива Фримена и Ната Прайса на эту тему .

1 голос
/ 11 декабря 2011

Вы должны будете объявить метод базового класса Redirect() как virtual, чтобы Rhino Mocks мог его высмеять. У меня сработало следующее:

public abstract class BaseClass
{
    public abstract void Execute();

    public virtual void Redirect()
    {
        // redirect code here
    }
}

public class Class1 : BaseClass
{
    public override void Execute()
    {
        // do some processing

        this.Redirect();
    }
}

..
var class1Mock = Rhino.Mocks.MockRepository.GeneratePartialMock<Class1>();

class1Mock.Expect(x => x.Redirect());
class1Mock.Execute();
class1Mock.VerifyAllExpectations();
...