Когда использовать Mock, Fake или Overrides? - PullRequest
0 голосов
/ 27 января 2012

Допустим, у меня есть метод ниже, называемый DoSomething.

При написании модульных тестов, как узнать, использовать ли подход Fake, Mock или Override и почему один лучше другого?

public List<MyClass> DoSomething()
{
  List<MyClass> data = GetData();

  if (data.Count == 0)
    return new List<MyClass>();

  data = GetFormattedData(data);

  if (data.Count == 0)
    return new List<MyClass>();

  return data;
}

[Test]
public void DoSomething_NoData_ReturnsEmptyList()
{
  //Change method parameters to pass in IDataProvider that exposes GetData method
  //Create FakeProvider class implementing IDataProvider
  //Ensure FakeProvider.GetData returns no data

  //Create FakeClass that inherits class from DoSomething class
  //Make FakeClass.GetData return no data
  //When DoSomething is called in the test it will call the parent class

  //Create Mock of class that DoSomething/GetData/GetFormattedData is in
  //Tell mock to make sure GetData returns empty list
  //Call DoSomething in test
}

[Test]
public void DoSomething_NoFormattedData_ReturnsEmptyList()
{
   //Same possibilities exist as above
}

Ответы [ 2 ]

1 голос
/ 27 января 2012

В этом случае вы могли бы снабдить вашу функцию данными так, чтобы сигнатура функции была public List<MyClass> DoSomething(List<MyClass data) Тогда ваша функция будет нести только одну ответственность, и это будет форматировать данные.

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

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

0 голосов
/ 27 января 2012

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

В любом случае, я не вижу особых различий, если честно, и IMO у вас есть два варианта:

  • насмешка (которая потребует перепроектирования битов и внедрения зависимости)
  • переопределение (известно как извлечение и переопределение )

Оба действительны, и ни один не является намного лучше, чем другие . Проблема с extract и override в том, что вам понадобятся дополнительные типы / файлы. Это, конечно, означает больше вещей, которыми можно управлять вручную - если этого можно избежать, так и должно быть. Лично я бы пошел с этим только , когда существующие фальшивые фреймворки не могут обработать ваш сценарий.

Основным преимуществом техники насмешек / инъекций является то, что она заставляет вас улучшать дизайн - имея в виду принципы SOLID и переписывая более тестируемый / управляемый код. Не говоря уже о том, что существует множество фреймворков, поддерживающих эту технику ( Moq , RhinoMocks , FakeItEasy - чтобы назвать самые популярные).

...