Модульный тест, чтобы проверить, называется ли метод действия сервисным уровнем - PullRequest
0 голосов
/ 13 декабря 2010

У меня есть контроллер с именем NewsController, конструктор этого контроллера получает INewsService в качестве параметра.

У меня есть метод в этом контроллере, называемый GetAllNews (), который возвращает результат JSON, который я использую для заполнения YUIТаблица данных.Я хочу написать модульный тест, который проверяет, был ли вызван метод FindAll службы новостей для возврата всех новостей.Как бы я это сделал?Сейчас у меня есть:

public JsonResult GetAllNews()
{
   var items = newsService.FindAll();
   var jsonResult = Json(items);

   return jsonResult;
}

Мой модульный тест для контроллера выглядит так:

public NewsControllerTest()
{
   newsServiceStub = MockRepository.GenerateStub<INewsService>();
   newsController = new NewsController(newsServiceStub);
}

[Test]
public void GetAllNews_should_use_news_service()
{
   // Arrange
   List<News> newsList = new List<News>();
   newsServiceStub.Stub(s => s.FindAll()).Return(newsList);

   // Act
   var actual = newsController.GetAllNews();

   // Assert
   newsServiceStub.VerifyAllExpectations();
}

Тест проходит с кодом выше.Но если бы я изменил GetAllNews (), чтобы он выглядел так, как показано ниже, то это тоже пройдет.Не должно ли это потерпеть неудачу?Я пытаюсь проверить, использует ли GetAllNews () службу новостей:

public JsonResult GetAllNews()
{
   return null;
}

Ответы [ 3 ]

3 голосов
/ 13 декабря 2010

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

So

public void GetAllNews_should_use_news_service()

должно быть

public void GetAllNews_should_get_all_the_news

и я оставлю вам детали кодирования.

1 голос
/ 14 декабря 2010

Вы можете найти эту статью Мартина Фаулера интересной о различиях между издевательствами и окурками.

http://www.martinfowler.com/articles/mocksArentStubs.html

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

1 голос
/ 13 декабря 2010

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

Однако, с точки зрения Rhino.Mocks, если вы хотите проверить ожидания, вы должны использовать Mock вместо Stub. Измените GenerateStub на GenerateMock, а .Stub() на .Expect(). Это должно исправить ваш тест.

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