Rails RSpec测试has_many:通过关系

Mar*_*tto 23 ruby rspec ruby-on-rails has-many has-many-through

我是测试和rails的新手,但我正试图让我的TDD进程正常运行.

我想知道你是否使用任何类型的范例来测试has_many:通过关系?(或者我认为一般只有has_many).

例如,我发现在我的模型规范中,我肯定会编写简单的测试来检查关系方法的关系的两端.

即:

require 'spec_helper'

describe Post do

  before(:each) do
    @attr = { :subject => "f00 Post Subject", :content => "8ar Post Body Content" }
  end

  describe "validations" do
  ...    
  end

  describe "categorized posts" do

    before(:each) do
      @post  = Post.create!(@attr)
    end

    it "should have a categories method" do
      @post.should respond_to(:categories)
    end

  end

end
Run Code Online (Sandbox Code Playgroud)

然后在我的类别规范中,我做反向测试并检查@ category.posts

我还缺少什么?谢谢!!

Pet*_*own 57

我建议看看名为Shoulda的宝石.它有很多宏用于测试关系和验证之类的东西.

如果您只想测试has_many关系是否存在,那么您可以执行以下操作:

describe Post do
  it { should have_many(:categories) }
end
Run Code Online (Sandbox Code Playgroud)

或者,如果您正在测试has_many:through,那么您将使用此:

describe Post do
  it { should have_many(:categories).through(:other_model) }
end
Run Code Online (Sandbox Code Playgroud)

我发现Shoulda Rdoc页面也非常有用.

  • 如何通过与期望syntex的关联来编写has_many? (2认同)

ran*_*min 5

为完整起见,2020 年无需额外宝石即可实现。

  it "has many categories" do
    should respond_to(:categories)
  end
Run Code Online (Sandbox Code Playgroud)

甚至更明确:

it "belongs to category" do
  t = Post.reflect_on_association(:category)
  expect(t.macro).to eq(:belongs_to)
end
Run Code Online (Sandbox Code Playgroud)

(参见Ruby API on Reflection

第二个示例确保“has_one”不会与“belongs_to”混淆,反之亦然

但是,它不限于 has_many :through 关系,还可以用于应用于模型的任何关联。

(注意:这是在Rails 5.2.4 中使用新的 rspec 2.11 语法