Rails Integration testing with MiniTest::Spec and Capybara
So you want to do integration testing for your application, good for you. If you have chosen MiniTest and it’s specing DSL MiniTest::Spec as your test framework here is an example how to setup the integration tests to run fairly fast. Integration tests are similar to Cucubmer features, if you have used that before. I just like this style better because Cucumber, IMO adds too much noise, but it serves you as application documentation. I will also user Capybara for the webpage testing.
Because we are using minitest-spec-rails gem, we don’t need to tinker with the config/application.rb and test settings, because ActiveSupport::TestCase is a subclass of MiniTest::Spec
First we will set up the gemfile, with the needed gems( I also use guard for my automated tests, but it’s worth writing another blog post, soon hopefully)
group :development, :test do
gem 'minitest-spec-rails'
gem 'capybara_minitest_spec' # for capybara integration and spec matchers
gem 'capybara-webkit' # for headless javascript tests
gem 'turn' # for prettier test output
end
After that we need to set up out test/test_helper.rb to use Turn and capybara
require 'rubygems'
require 'rails/test_help'
require 'minitest/autorun'
require 'capybara/rails'
require 'turn'
class ActionDispatch::IntegrationTest
include Rails.application.routes.url_helpers # for x_path and x_url helpers
include Capybara::DSL
include PossibleJSDriver # switching Capybara driver for javascript tests, look below
end
# switching to the javascript driver in integration tests
module PossibleJSDriver
def require_js
Capybara.current_driver = :webkit
end
def teardown
super
Capybara.current_driver = nil
end
end
After you have everything set up you can use all of this in your integration tests, here is an example of one integration test, without and with javascript browser turned on(require_js turns on the webkit driver)
require 'test_helper'
class LoginTest < ActionDispatch::IntegrationTest
before { visit login_path }
describe "signup text" do
it "must have a signup text" do
page.must_have_content("Don't have an account?")
end
it "must have a signup link" do
page.find_link('Sign up').wont_be_nil
end
it "signup link must go to the signup path" do
require_js # this one turns on the webkit javascript driver
click_link('Sign up')
current_path.must_equal(signup_path)
end
end
end
I have tested the integration test speed with :webkit as a default capybara driver and it runs at the same speed as the normal :rack_test driver, so you can go that way too.
Resources used: https://github.com/metaskills/minitest-spec-rails https://github.com/blowmage/minitest-rails https://github.com/blowmage/minitest-rails-capybara http://stackoverflow.com/questions/5655154/how-do-you-perform-javascript-tests-with-minitest-capybara-selenium/13296544#13296544 https://github.com/thoughtbot/capybara-webkit
Comments