Должен ли я тестировать реализацию методов с использованием макетов - PullRequest
0 голосов
/ 30 января 2009

У меня проблемы с выполнением модульного тестирования с использованием moq.

Если у меня есть такая функция:

public string GetName(IMapinfoWrapper wrapper)
{
   return wrapper.Evaluate("My com command");
   ///"My comm command" is the same all the time.
}

Затем у меня есть тест, который проверяет возвращаемое значение функции GetName:

[Test]
public void Test()
{
  Mock<IMapinfoWrapper> mock = new Mock<IMapinfoWrapper>();
  mock.Expect(mapinfo => mapinfo.Evaluate(It.IsAny<String>()))
      .Returns("TableName");

  Assert.AreEqual("TableName", GetName(mock.object));
}

Так что мой вопрос, должен ли макет быть определен так:

mock.Expect(mapinfo => mapinfo.Evaluate(It.IsAny<String>()))
    .Returns("TableName");

или как это:

mock.Expect(mapinfo => mapinfo.Evaluate("My com command")
    .Returns("TableName");

Моя единственная проблема с использованием второго способа заключается в том, что я чувствую, что связываю реализацию метода GetName, чтобы всегда использовать строку «Моя команда com» внутри.

Это то, что я должен делать, или я все делаю неправильно?
Я только начал проводить юнит-тестирование и издевательство, поэтому я до сих пор не уверен, как все должно сочетаться.

1 Ответ

3 голосов
/ 30 января 2009

Это зависит от того, что вы на самом деле тестируете.

Если ожидается, что любая строка, переданная в Evaluate, вернет «TableName», используйте вызов IsAny.

В противном случае, если вы ожидаете конкретного вывода при заданном вводе, например, в случае передачи команды «Мой ком», передайте второй.

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

...