Использование Minitest in Rails
Недавно я прочитал несколько статей о Minitest. Мне очень нравится идея суперлегкой тестовой платформы. Я решил заменить rspec на него в недавнем проекте и не повезло получить все, чтобы работать. Мои проблемы:
a) получение именованных маршрутов в моих тестах на прием/интеграцию (rspec и test:: unit, похоже, автоматически включают их, но не идут с minitest),
б) и общая нехватка усыновления в рельсах делает меня беспокойным (все, кажется, используют rspec, хотя использовали больше с драгоценными камнями/библиотеками).
Стоит ли использовать minitest, когда rspec имеет основное доминирование при тестировании рельсовых приложений?
Ответы
Ответ 1
Я автор minitest-rails. С тех пор, как вы это задали, ситуация сильно изменилась. Мой ответ предполагает, что вы используете мини-рельсы.
Именованные маршруты
Если вы используете minitest-rails, это просто работает (сейчас). Вы можете использовать генераторы для создания этих тестов или написать их самостоятельно. Все указанные маршруты доступны в тестах приемки/интеграции.
require "minitest_helper"
describe "Homepage Acceptance Test" do
it "must load successfully" do
get root_path
assert_response :success
end
end
Утверждение
Я думаю, что мы будем продолжать уделять повышенное внимание использованию Minitest с Rails по мере приближения к Rails 4.
Стоит ли это?
Я думаю, что начиная с Minitest теперь это стоит того. Сейчас в Minitest происходит огромная активность. Он хорошо сочетается с недавним фокусом на быстрых тестах. Но это действительно зависит от динамики вашего приложения и команды.
Ответ 2
Недавно я переключил приложение от Rspec на Minitest, и это того стоило. Тесты выполняются намного быстрее, синтаксис поощряет более умный, более компактный код, и как-то я просто больше уверен в этом пакете (меньше магии на работе).
Улучшение распространяется на интеграционные/приемочные испытания, я считаю, что Minitest с Capybara гораздо читабельнее и прямолинейнее, чем Cucumber (и гораздо менее хрупким).
Ниже приведен вспомогательный файл, который должен быть всем, что вам нужно, чтобы получить блок, функциональные и интеграционные тесты, запущенные с помощью Minitest с использованием синтаксиса спецификаций. Это было основано на сущности @tenderlove и много чтения/экспериментов. Примечания и оговорки ниже.
ENV["RAILS_ENV"] = "test"
require File.expand_path('../../config/environment', __FILE__)
require 'rubygems'
gem 'minitest'
require 'minitest/autorun'
require 'action_controller/test_case'
require 'miniskirt'
require 'capybara/rails'
require 'mocha'
require 'turn'
# Support files
Dir["#{File.expand_path(File.dirname(__FILE__))}/support/*.rb"].each do |file|
require file
end
class MiniTest::Spec
include ActiveSupport::Testing::SetupAndTeardown
alias :method_name :__name__ if defined? :__name__
end
class ControllerSpec < MiniTest::Spec
include Rails.application.routes.url_helpers
include ActionController::TestCase::Behavior
before do
@routes = Rails.application.routes
end
end
# Test subjects ending with 'Controller' are treated as functional tests
# e.g. describe TestController do ...
MiniTest::Spec.register_spec_type( /Controller$/, ControllerSpec )
class AcceptanceSpec < MiniTest::Spec
include Rails.application.routes.url_helpers
include Capybara::DSL
before do
@routes = Rails.application.routes
end
end
# Test subjects ending with 'Integration' are treated as acceptance/integration tests
# e.g. describe 'Test system Integration' do ...
MiniTest::Spec.register_spec_type( /Integration$/, AcceptanceSpec )
Turn.config do |c|
# use one of output formats:
# :outline - turn original case/test outline mode [default]
# :progress - indicates progress with progress bar
# :dotted - test/unit traditional dot-progress mode
# :pretty - new pretty reporter
# :marshal - dump output as YAML (normal run mode only)
# :cue - interactive testing
c.format = :cue
# turn on invoke/execute tracing, enable full backtrace
c.trace = true
# use humanized test names (works only with :outline format)
c.natural = true
end
Примечания
- Предназначен для использования в Rails 3.1 или 3.2. Не пробовали ниже этого.
-
gem 'minitest'
необходим для получения более продвинутых функций Minitest (let
блоков и т.д.).
- В нем используются мокко (более полные макеты/заглушки), мини-юбка (factory_girl lite) и новый поворот. Ни одна из них не является зависимым.
- В Rails 3.2 вложенные блоки
describe
в тестах контроллера вызывают ошибку
Ответ 3
В прошлые дни я немного поработал, чтобы сделать Rails с minitest очень простым. Посмотрите http://rawonrails.blogspot.com/2012/01/better-way-of-testing-rails-application.html, чтобы найти больше.
Ответ 4
minitest-rails gem делает это легко.
Ответ 5
Кодирование Ningja "MiniTest:: Настройка параметров с Capybara in Rails 3.1" очень помогло интегрировать Minitest с Rails.
http://code-ningja.posterous.com/73460416