Почему люди не получают доступ к базе данных в Rspec? - PullRequest
4 голосов
/ 24 августа 2011

Я часто вижу код, который использует макет в Rspec, например:

describe "GET show" do
  it "should find and assign @question" do
    question = Question.new

    Question.should_receive(:find).with("123").and_return(question)
    get :show, :id => 123

    assigns[:question].should == question
  end
end

Но почему они не добавляют Question с id => 123 в базу данных, извлекают его с помощью get и уничтожают? Это лучшая практика? Если я не буду следовать правилу, случится ли что-то плохое?

Ответы [ 2 ]

7 голосов
/ 24 августа 2011

Когда вы пишете поведенческий тест (или модульный тест), вы пытаетесь протестировать только определенную часть кода, а не весь стек.

Чтобы объяснить это лучше, вы просто выражаетеи тестирование, что «функция A должна вызывать функцию B с этими параметрами», поэтому вы тестируете функцию A, а не функцию B, для которой вы предоставляете макет.

Это важно по ряду причин:

  1. Вам не нужна база данных, установленная на каждом компьютере, на котором вы собираете свой код, это важно, если вы начнете использовать машины сборки (и / или непрерывную интеграцию) в своей компании с сотнями проектов.
  2. Вы получаете лучшие результаты теста, потому что, если функция B сломана или база данных не работает должным образом, вы не получите сбой теста для функции A.
  3. Ваши тесты выполняются быстрее.
  4. Всегда тяжело иметь чистую базу данных перед каждым тестом.Что если предыдущий запуск ваших тестов был остановлен, и в базе данных остался вопрос с этим идентификатором?Вероятно, вы получите сбой теста из-за дублирования идентификатора, хотя в действительности эта функция работает правильно.
  5. Перед запуском теста вам необходима правильная конфигурация.Это не такая уж невероятная проблема, но гораздо лучше, если тесты могут выполняться «из коробки», без необходимости конфигурировать соединение с базой данных, папку временных тестовых файлов, SMTP-сервер для тестирования почтовых сообщений и т. Д.

Тест, который фактически проверяет весь стек, называется «сквозным тестированием» или «интеграционным тестированием» (в зависимости от того, что он тестирует).Это также важно, например, можно использовать набор тестов без фиктивной базы данных, чтобы увидеть, может ли данное приложение безопасно работать с БД, отличной от той, которая использовалась во время разработки, и в конечном итоге исправить функции, которые содержат ошибочные операторы SQL.

2 голосов
/ 24 августа 2011

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

Question.new будет достаточно, потому что в любом случае он проходит через допустимые методы rails, так что многиелюди склонны использовать их, в том числе и потому, что они работают быстрее.

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

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

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

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