Shoulda Matcher

我們剛剛在 Course 內定義了「標題不能為空」。我們也想在 model 裡面加入這個測試。

class Course < ActiveRecord::Base
  validates :title, presence: true
end

安裝 Should Matchers

Shoulda Matchers 提供了許多測試用的匹配方法(Matcher),可以用來測試 Active ModelActive 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_expectedRSpec 的 Oneliner 之一,等價於:

it { is_expected.to validate_presence_of(:title) }

# equals to

it { expect(subject).to validate_presence_of(:title) }

而每個 RSpec 測試缺省都有 subject,值為 described_class.newdescribed_class 在這個例子裡是 Course

$ rspec spec/models/course_spec.rb
.

Finished in 0.00867 seconds (files took 1.24 seconds to load)
1 example, 0 failures

results matching ""

    No results matching ""