はじめに
「RSpecは expect(X).to
みたいな書き方しかできないから嫌い!」
「RSpecでも assert xxx
や assert_equal X, Y
を使いたい!」
と思ったことはありませんか?
この記事はそんなふうに考えている方へのHowto記事です。
rspec-railsでMinitestのアサーションを使う
実はrspec-railsを使うと、デフォルトでMinitestのアサーションが使えるようになっています。
もし手元にrspec-railsを使っているプロジェクトがあれば、試しに以下のようなコードを実行してみてください。
きっとパスするはずです。
require 'rails_helper'
describe 'Sample' do
example do
expect(1 + 1).to eq 2
# Minitestのアサーションを使う
assert_equal 2, (1 + 1)
assert ''.blank?
refute ''.present?
end
end
参考:テスト失敗時の出力例
F
Failures:
1) Sample should eq 2
Failure/Error: assert_equal 2, (1 + 10)
Minitest::Assertion:
Expected: 2
Actual: 11
# ./spec/models/sample_spec.rb:8:in `block (2 levels) in <top (required)>'
Finished in 0.00235 seconds (files took 2.35 seconds to load)
1 example, 1 failure
Failed examples:
rspec ./spec/models/sample_spec.rb:4 # Sample should eq 2
動作確認した環境
- Ruby 2.2.2
- Rails 4.2.1
- rspec-rails 3.2.1
素のRSpecでMinitestのアサーションを使う
rspec-railsを使わない、素のRSpecでもMinitestのアサーションを使う方法はあります。
手順は以下の通りです。
1. GemfileにMinitestを追加
source "https://rubygems.org"
gem "rspec"
+gem "minitest"
# Minitestをインストール
bundle install
2. spec_helper.rbにMinitestを使う設定を追加
RSpec.configure do |config|
+ config.expect_with :rspec, :minitest
config.expect_with :rspec do |expectations|
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
end
# ...
3. Minitestのアサーションを使ってテストを書く
require 'spec_helper'
describe 'Sample' do
example do
expect(1 + 1).to eq 2
# Minitestのアサーションを使う
assert_equal 2, (1 + 1)
assert ''.empty?
refute 'X'.empty?
end
end
# 実行
bundle exec rspec
備考
素のRSpec環境をセットアップする方法は @yusabana さんの以下の記事を参考にしてください。
RailsじゃないRspec3環境を構築する方法 - Qiita
動作確認した環境
- Ruby 2.2.2
- rspec 3.2.0
- minitest 5.7.0
まとめ
「あれ?RSpecってこんなときどんなマッチャを使うんだったっけなー?あー、調べるの面倒くさい!」って思ったときは、サクッとアサーションを書くのもアリかもしれませんね。
以上、ご参考までに。
あわせて読みたい
Minitestのアサーションもいいけど、あらためてRSpecのマッチャを勉強したいなと思った方はこちらの記事をどうぞ!