C #: Как выполнить модульное тестирование метода, который опирается на другой метод в том же классе? - PullRequest
3 голосов
/ 08 января 2011

У меня есть класс, подобный следующему:

public class MyProxy : ClientBase<IService>, IService
{
    public MyProxy(String endpointConfiguration) :
        base(endpointConfiguration) { }

    public int DoSomething(int x)
    {
        int result = DoSomethingToX(x); //This passes unit testing

        int result2 = ((IService)this).DoWork(x)

        //do I have to extract this part into a separate method just
        //to test it even though it's only a couple of lines?
        //Do something on result2
        int result3 = result2 ...

        return result3;
    }

    int IService.DoWork(int x)
    {
        return base.Channel.DoWork(x);
    }
}

Проблема заключается в том, что при тестировании я не знаю, как смоделировать элемент result2 без выделения части, которая получает result3 с использованием result2, в отдельный метод. И, поскольку это модульное тестирование, я не хочу вдаваться в подробности, чтобы проверить, каким будет результат result2 ... Я бы предпочел посмеяться над данными как-то ... например, иметь возможность вызвать функцию и заменить только это один звонок.

Ответы [ 5 ]

3 голосов
/ 08 января 2011

У вас есть предпочтения насмешливым фреймворкам?

Функция Partial Mock в Rhino Mocks , похоже, должна делать то, что вы хотите.

2 голосов
/ 08 января 2011

Вы не можете этого сделать. У вас есть три варианта:

  • Подкласс MyProxy и переопределение DoWork, что потребует некоторых хлопот, чтобы угодить компилятору
  • Смоделируйте свойство Channel, которое потребует его установки в базовом классе
  • Переместите DoWork в другой класс, передайте ему Channel в конструкторе и смоделируйте это в своих тестах
1 голос
/ 12 января 2011

Выполните следующие действия:

Установите свойство IService, например:

public IService MyService { get; set; }

Тогда вы можете сделать: int result2 = MyService.DoWork(x) столько, сколько где-то вконструктор или что вы установили MyService = this;

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

0 голосов
/ 10 января 2011

Я полагаю, что у вас возникла проблема с дизайном, ваш IService. Скорее всего, DoWork должен находиться в другом классе, он выглядит как простая оболочка для чего-то другого.Рассматривали ли вы рефакторинг?

Тогда, если он живет в другом классе, вам не нужна особая обработка для насмешек.

0 голосов
/ 08 января 2011

Вы можете сделать это, используя последний проект Microsoft Research Моль

Как только вы запустите его, вы можете выполнить следующие действия:

MMyProxy.DoWork32 = () => put your mock result here.

Не забудьте установить moleBehavior впровал для непроверенных методов.

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