2016-06-16 1 views
3

Только начал изучать и писать блок тестирования день назад, так что это, вероятно, слишком простой вопрос:Модульное тестирование, если метод создания записи в базе данных

У меня есть этот метод в моем DBTaskHanlder классе, который я хочу сделать некоторые единица, я был в состоянии написать один для того, когда ModelState не действует, но теперь для следующего:

public bool CreateTask(ForgotPasswordViewModel fpModel) 
{ 
    if (!ModelState.IsValid) 
    { 
     return false; 
    } 

    try 
    { 
     CreateTaskFromModel(fpModel); 
     _dbContext.SaveChanges(); 
     return true; 
    } 
    catch (Exception e) 
    { 
     var issue = e.ToString(); 
     throw; 
    } 
} 

это CreateTaskFromModel является private метод и хорошо называется его работа, чтобы создать новую строку в базе данных на столе , Итак, я хотел проверить, когда этот метод вызывается, создается ли одна новая строка в БД? Действительно ли это правильная вещь для тестирования? Как проверить? Я не думаю, что мы должны ударить и вставить в настоящую базу данных?

private void CreateTaskFromModel(ForgotPasswordViewModel fpModel) 
    { 
     var message = _dbContext.Create<Message>();   
     message.MessageType = "TASK".PadLeft(10); 
     message.Assigned_User_K = fpModel.SendPasswordRequestTo.Trim(); 
     message.Assigned_Date = DateTime.Today; 
     message.Source_User_K = string.Empty; 
     message.Target_File_K = "WEBCFGPHRM";   
     message.Owner_User_K = string.Empty; 
     message.Message_K = _keyGenerator.Get10ByteBase36Key(); 

     _dbContext.Messages.Add(message); 
    } 
+5

Это правильная вещь для проверки, но ее не следует называть «модульным тестом» в этот момент - «интеграционный тест» будет лучшим названием. См. Http://stackoverflow.com/questions/10752/what-is-the-difference-between-integration-and-unit-tests –

ответ

3

Я не думаю, что мы должны ударить и вставить в реальный право на базу данных?

Да, вы должны. Это не «единичный тест», но это ценный тест. По мере совершенствования программирования вы обнаружите, что большинство ваших ошибок находятся на краю вашей программы, где она касается других вещей, таких как базы данных.

Мне нравится писать CRUD тесты. Один «тестовый метод», который фактически выполняет серию тестов. Обычно в этой схеме:

  1. Создать
  2. Читайте по первичному ключу. Были ли все поля правильно установлены?
  3. Прочитать сборник. Вы получите много записей, это новая запись в коллекции?
  4. Обновление
  5. Прочитать первичный ключ. Правильно ли изменились поля?
  6. Удалить
  7. Прочитать первичный ключ. Ничего не было возвращено, не так ли?
  8. Прочитать сборник. У вас будет много записей, а новая запись больше не будет в коллекции? Остальные записи остались?

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

+0

да, я не хочу, чтобы я делал интеграционный тест на этом, кто-то еще в прошлом написал фактический материал вставки, так что я просто делаю чистый модульный тест. – Travolta

+0

Класс называется «DBTaskHandler». Это довольно хороший признак того, что вы должны тестировать его в сочетании с базой данных. Не позволяйте себе завлекаться, думая, что модульные тесты как-то лучше, чем интеграционные тесты. Несмотря на то, что говорят блоггеры, ни один тест по своей сути лучше другого в глобальном смысле. –

1

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

Для того, чтобы он был «чистым» модульного тестирования, вам необходимо только тест , что частности функциональность. Итак, как вы тестируете метод, который вставляет db, фактически не вставляя что-либо в базу данных (или , имеющую базу данных, если на то пошло)? Макет объектов! :) . Вот аналогичный вопрос на ваш вопрос: How to unit test an object with database queries

Также простой поиск по Google поможет вам лучше понять его. Но, в любом случае, вы находитесь mocking база данных или любой другой объект, который вам нужен. Для этого вам, вероятно, понадобится какая-то внешняя библиотека, но это не должно быть проблемой, потому что насмешка сейчас довольно распространенная вещь. Некоторые полезные ссылки:

https://msdn.microsoft.com/en-ca/library/ff650441.aspx

https://en.wikipedia.org/wiki/Mock_object

Good Luck!

+0

Да, я не хочу, чтобы я делал интеграционный тест на этом, кто-то еще в прошлом написали фактический материал вставки, так что я просто делаю чистый модульный тест. – Travolta

+0

Даже с издевательством по уровню доступа к данным, как бы избежать выполните следующую операцию чтения, чтобы проверить, действительно ли запись была добавлена ​​в хранилище данных mock? Единичный тест для добавления записи теперь зависит от реализации чтения записей. Как бы вы поступили? –

+0

Отвечая на мой собственный комментарий: Возможно, мы просто проверим правильные методы интерфейса из репозитория, назвав соответствующее количество раз. Но на самом деле он не проверяет код для дополнительной ошибочной логики. –

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