使用rspec + shoulda-matchers进行测试

时间:2016-03-15 02:32:08

标签: ruby-on-rails rspec shoulda

我之前从未编写过我自己的测试,我刚刚完成模型关联并迁移它们,所以现在我想测试它们。我已添加到gemfile并在gem 'shoulda-matchers', '~> 3.0'下安装了group :test,在gem 'rspec-rails', '~> 3.0'下安装了group :development, :test。将shoulda-matcher的配置添加到spec / rails_helper.rb中。下一步是什么?测试文件将进入哪个目录?编写shoulda匹配器的语法规则是什么,与rspec相同?我怎样才能检查这种关联是否正常工作?

class Artist < ApplicationRecord
  has_many events, :through => :lineups
end
像这样?

describe Artist do
  it { should have_many(:events).through(:lineups) }
end

1 个答案:

答案 0 :(得分:2)

对我来说这看起来不错 - 这是另一个使用类Listing来测试关联和验证的示例。

class Listing < ActiveRecord::Base

  #Associations
  belongs_to :user
  belongs_to :category, inverse_of: :listings
  has_many :photos, dependent: :destroy 
  has_many :watches
  has_many :watchers, -> { uniq }, :through => :watches
  has_many :offers, dependent: :destroy
  has_many :feedbacks
  belongs_to :location, :dependent => :destroy

  # Association validations
  validates_presence_of :category
  validates_presence_of :user

  # Attribute validations
  validates_presence_of :title, message: "Please add a title."
  validates_presence_of :subtitle, message: "Please add a subtitle."
  validates_presence_of :price, message: "Please add a price."
  validates_presence_of :title, message: "Please select a condition."
require 'rails_helper'

RSpec.describe Listing, type: :model do

  #Associations
  it { should belong_to(:user) }
  it { should belong_to(:category) }
  it { should have_many(:photos) }
  it { should have_many(:watches) }
  it { should have_many(:watchers).through(:watches) }
  it { should have_many(:offers) }
  it { should belong_to(:location).dependent(:destroy) }

  #Association validations
  it { should validate_presence_of(:category) }
  it { should validate_presence_of(:user) }

  #Attribute validations
  it { should validate_presence_of(:title).with_message("Please add a title.") }
  it { should validate_presence_of(:subtitle).with_message("Please add a subtitle.") }
  it { should validate_presence_of(:price).with_message("Please add a price.") }
  it { should validate_presence_of(:title).with_message("Please select a condition.") }

请注意使用RSpec.describe Class, type: :model指定测试类型。

我会阅读Shoulda自述文件,它解释了有关各种示例组中匹配器的可用性的更多信息。它们提供了四类匹配器:

  

ActiveRecord和ActiveModel匹配器仅在型号中可用   示例组,即标记有类型:: model或文件的组   位于规格/型号下。

     

ActionController匹配器仅在控制器示例中可用   组,即标记有类型::控制器或位于文件中的组   在spec / controllers下。

     

路由匹配器也可用于路由示例组,即   标记为类型::路由或位于文件下的文件   规格/路由。

     

所有示例组都提供独立匹配器。

在安排您的规范方面,旨在镜像您的应用目录(或多或少)。

所以如果你有:

app/models/user.rb
app/services/
app/controllers/
app/presenters/

您可以使用以下方式进行镜像:

spec/models/user_spec.rb
spec/services/
spec/controllers/
spec/presenters/

然后您可能会有一些额外的规范文件夹,例如:

spec/features/ (a folder for integration/feature specs)

RSpec文档中有一些非常好的信息。