2010-09-15 3 views
5

Я относительно новичок в использовании TDD и в последнее время читал о насмехающихся объектах. У меня есть следующий тест, чтобы проверить метод, который дал дату, в следующую субботу.Должен ли я издеваться над следующим примером:

[TestMethod()] 
     public void NextSaturdayTest() 
     { 
      DateTime date = new DateTime(); 
      date = DateTime.Parse("2010-08-14"); 
      DateTime expected = new DateTime(); 
      expected = DateTime.Parse("2010-08-21"); 
      DateTime actual; 
      actual = DateExtensions.NextSaturday(date); 
      Assert.AreEqual(expected, actual); 

      date = DateTime.Parse("2010-08-19"); 
      expected = DateTime.Parse("2010-08-21"); 
      actual = DateExtensions.NextSaturday(date); 
      Assert.AreEqual(expected, actual); 
     } 

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

Сообщите мне, если я могу предложить более подробную информацию.

Спасибо за любые мысли

ответ

7

Во-первых, не делать этого:

DateTime date = new DateTime(); 
date = DateTime.Parse("2010-08-14"); 

Вы создаете новый DateTime, а затем выбросить, когда вы разобрать string, чтобы получить новое datetime.Remember, тестовый код все равно должен быть хорошим кодом.

Во-вторых, хороший тест-тест одно. У вас может быть несколько тестов, таких как ReturnsCorrectNextSaturdayGivenAWednesday, ReturnsCorrectNextSaturdayWhenCrossesEndOfMonth и ReturnsCorrectNextSaturdayWhenCrossesEndOfYear.

И, наконец, нет причин для издевательств здесь. Макет был бы уместным, если ваши DateExtensions вызывались в другой компонент (скажем, в базу данных), и вы хотели подделать этот вызов. Поэтому вместо тестирования DateExtensions + Data Access вы должны тестировать DateExtensions и когда он называется уровнем доступа к данным, это будет макет, который ваш тест настроен.

5

Mocking используется для удовлетворения зависимостей.

Например. Рассмотрим, если у вас есть класс, который загружает пользователей из базы данных с помощью IDataLayer (обертки вокруг базы данных)

При тестировании, вы не хотите, чтобы проверить по базе данных. Это затрудняет предоставление данных и проверку результата. Вместо этого вы издеваетесь над объектом IDataLayer, чтобы иметь возможность вручную предоставлять пользователю UserService. Это упрощает проверку того, что UserService делает то, что он должен делать.

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

2

В этом случае фальшивая структура не нужна и, следовательно, не должна использоваться.

Ваш тест является достаточно разумным. Я бы лично рядный большую часть даты парсинг для лучшей читаемости:

[TestMethod()] 
    public void NextSaturdayTest() 
    { 
     DateTime actual = DateExtensions.NextSaturday(DateTime.Parse("2010-08-14")); 
     Assert.AreEqual(DateTime.Parse("2010-08-21"), actual); 

     actual = DateExtensions.NextSaturday(DateTime.Parse("2010-08-19")); 
     Assert.AreEqual(DateTime.Parse("2010-08-21"), actual); 
    } 
2

Я думаю, что вы в порядке без насмешек в этом случае. Как правило, вы издеваетесь над какой-то зависимостью (например, если у вас есть DateProvider или что-то в этом роде), но в этом случае использование DateTime напрямую выглядит хорошо для меня.

Я хотел бы, однако, очистить ваш тест. Вы должны придерживаться тестирования одной вещи для каждого метода, потому что если этот метод тестирования не удастся, вы будете знать, ПОЧЕМУ это не удается, а не проверять утверждения и задаться вопросом, прошли ли остальные из них.

[TestMethod()] 
public void NextSaturdayReturnsCorrectValueStartingFromASaturday() 
{ 
    DateTime date = DateTime.Parse("2010-08-14"); 

    DateTime expected = DateTime.Parse("2010-08-21"); 
    DateTime actual = DateExtensions.NextSaturday(date); 

    Assert.AreEqual(expected, actual); 
} 

[TestMethod()] 
public void NextSaturdayReturnsCorrectValueWithinTheSameWeek() 
{ 
    DateTime date = DateTime.Parse("2010-08-19"); 
    DateTime expected = DateTime.Parse("2010-08-21"); 
    DateTime actual = DateExtensions.NextSaturday(date); 

    Assert.AreEqual(expected, actual); 
} 

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

Смежные вопросы