Shoulda Matcher
我們剛剛在 Course 內定義了「標題不能為空」。我們也想在 model 裡面加入這個測試。
class Course < ActiveRecord::Base
validates :title, presence: true
end
安裝 Should Matchers
Shoulda Matchers 提供了許多測試用的匹配方法(Matcher),可以用來測試 Active Model、Active Record 以及 Action Controller。
安裝方法:
加入 should-matchers
在 Gemfile
group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug', platform: :mri
gem 'rspec-rails', '3.5.2'
gem 'rails-controller-testing'
gem "factory_girl_rails"
gem "shoulda-matchers", "~> 3.1.1" # <-- 新增這一行
end
然後 bundle install
,並加入 shoulda-matchers 的配置文件:
touch spec/support/shoulda_matchers.rb
填入以下內容:
Shoulda::Matchers.configure do |config|
config.integrate do |with|
with.test_framework :rspec
with.library :rails
end
end
告訴 Shoulda Matchers 我們是用 RSpec 來測試 Rails 專案。
修改 spec/models/course_spec.rb
Shoulda Matchers 提供了許多的匹配方法來測試 Model,這裡我們使用 validate_presence_of
這個 Matcher 來測試 Course 必須要填寫 title。
編輯 spec/models/course_spec.rb
,拿掉 type: :model
以及加入新的測試。:
require "rails_helper"
RSpec.describe Course do
it { is_expected.to validate_presence_of(:title) }
end
is_expected
is_expected
是 RSpec 的 Oneliner 之一,等價於:
it { is_expected.to validate_presence_of(:title) }
# equals to
it { expect(subject).to validate_presence_of(:title) }
而每個 RSpec 測試缺省都有 subject
,值為 described_class.new
,described_class
在這個例子裡是 Course
。
$ rspec spec/models/course_spec.rb
.
Finished in 0.00867 seconds (files took 1.24 seconds to load)
1 example, 0 failures