Welcome to ‘minitest’ world! Minitest is yet another ruby testing framework but it’s not a replacement to rspec. In rspec you can readily use things like ‘subject’, ‘metadata’ etc. However, minitest, as the name suggests, is a light-weight testing framework and does not include a lot of these features automatically. Here is a list of gems that you can use to enhance minitest-rails.
m is a test runner similar to
rspec command in rspec framework. Using this we can run single test using line numbers too. Users who don’t like this gem can also run tests using default rake tasks provided by minitest.
metadata is one of the cool features in rspec. Using this we can tag scenarios across files. Unfortunately minitest doesn’t support this feature by default. We have to include a separate gem called minitest-metadata. We can implement rspec conditional hooks functionality through this gem as follows:
require "test_helper" describe UsersController do before do @user = create(:user) if metadata[:before_each] == true end it "must create user" do assert_difference('User.count') do post :create, user: attributes_for(:user) end assert_redirected_to user_path(assigns(:user)) end it "must show user", before_each: true do get :show, id: @user assert_response :success end end
When we run the file
before code block will run only for the latter test case.
subject is one of the best ways to dry up your specs. To dry up your specs in minitest you have explicity include a gem called minitest-implicit-subject. Here is an example:
require "test_helper" describe User do it "foo returns bar" do subject.must_equal User end end
There is slight difference that I have observed in minitest
subject from rspec
subject. In minitest if you write
subject it returns current class name under which it has included. In this scenario it returns output as
User class not
User object. But in rspec it returns
rspec expectation framework lets you code example more readable. In minitest there is separate gem called minitest-spec-expect available to make your code example readable as same as in rspec. Here is an example:
require "test_helper" describe User do it "must be valid" do expect(subject.new.valid?).to_equal true end end
Using capybara is one of the ways to implement your integration test suite in rspec. We need to include separate gem called minitest-rails-capybara in minitest to write integration tests using the capybara DSL. Here is a simple example:
require "test_helper" feature "User" do scenario "should be able save" do visit users_path click_link 'New User' fill_in "user_first_name", with: 'Siva' click_button 'Create User' expect(User.all.count).to_equal 1 end end
In my next post I will talk about the gems that allow us to mock and stub requests in minitest.