2016-07-11 2 views
0

Я хочу написать несколько тестов для моего текущего проекта.Rails: какой метод тестирования использовать

Эти тесты будут в основном связаны с сохраненными данными в базе данных.

Например:

  • Если пользователь зарегистрирован 7 лет назад, предоставить ему gold badge (логическое поле значение True)

  • Если вы зарегистрированы 3 лет назад, тогда bronze badge и т.д.

Ну, расчеты немного сложнее b перед булевым полем установлено значение true. Есть около 30-40 тестовых примеров, которые мне нужно проверить, которые очень похожи на приведенные выше два примера.

Я сделал некоторые чтения о Rails тестирования, но я не мог понять точную разницу между интеграцией, единицами и функциональным тестированием в Rails.

В моем случае, какой метод тестирования будет уместен?

ответ

0

Я думаю, это зависит от того, как вы его реализуете.

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

Если вы обновляете, когда пользователь входит в систему, вы можете использовать тест модели (единицы). Например:

class UserTest < ActiveSupport::TestCase 
    test "users badge is updated on login if needed" do 
    user = User.create ... , golden_badge: false 
    travel_to Time.now + 7.years do 
     # simulate login, something like: user.login(user: "", pass: "") 
     assert user.golden_badge 
    end 
    end 
end 

этот тест будет проходить в test/models/user_test.rb

0

Это зависит от того, где именно код, который обновляет это поле выполняется. Например, если вы проверить эту «награду» на обновлениях пользователя в самой модели пользователя, как показано ниже:

class User < ActiveRecord::Base 
    before_save :check_rewards 

    def check_rewards 
    self.update(golden_badge: true) if created_at > 5.years.ago 
    end 

Тогда тестам нужны только иметь место в модели/user_spec.rb который является испытанием блока ,

Если код запускался как задание cron каждый час, в котором использовался метод в файле с именем check_rewards.rb, который, вероятно, принадлежал бы двум местам.

Во-первых, работает «единичный» тест объекта, который выполняет обновление в сервисах/check_rewards.rb (или команды/check_rewards.rb или любой другой каталог) для проверки фактической функциональности, например, мой код спецификации пользователя выше.

Наконец, у вас должен быть интеграционный тест в интеграции/check_rewards_spec.rb, чтобы убедиться, что менеджер заданий работает, как ожидалось, так что само задание фактически выполняется и имеет ожидаемое поведение.

+0

before_save редко вызывает пользователя, я думаю. Было бы очень неудобно, если пользователь обновит свой адрес электронной почты, а затем получит значок: grin: – siegy22

+0

Он редко называется без условия, я более упростил это. Я часто делаю before_save: do_somthing, если: should_do_something? например. – RichardAE

0

Тестирование модулей: для тестирования наименьшей единицы кода. Для конкретной функциональности. Как тестирование работы CRUD в контроллере. Каждое действие будет тестироваться отдельно при тестировании устройства.

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

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

Unit tests tell a developer that the code is doing things right; functional tests tell a developer that the code is doing the right things.

Подробнее here

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

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