我是测试和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
然后在我的类别规范中,我进行反向测试并检查@ category.posts
我还缺少什么?谢谢!
答案 0 :(得分:56)
我建议看一下名为Shoulda的宝石。它有很多宏用于测试关系和验证之类的东西。
如果您只想测试has_many关系是否存在,那么您可以执行以下操作:
describe Post do
it { should have_many(:categories) }
end
或者如果您正在测试has_many:through,那么您将使用它:
describe Post do
it { should have_many(:categories).through(:other_model) }
end
我发现Shoulda Rdoc页面也非常有用。
答案 1 :(得分:3)
出于完整性考虑,到2020年,无需额外的宝石就可以实现。
it "has many categories" do
should respond_to(:categories)
end
更明确的是:
it "belongs to category" do
t = Post.reflect_on_association(:category)
expect(t.macro).to eq(:belongs_to)
end
第二个示例确保“ has_one”不是 与“ belongs_to”混淆,反之亦然
但是,它不仅限于has_many:through关系,还可以用于应用于模型的任何关联。
(注意:这是将new rspec 2.11 syntax与Rails 5.2.4一起使用)
答案 2 :(得分:2)
describe "when Book.new is called" do
before(:each) do
@book = Book.new
end
#otm
it "should be ok with an associated publisher" do
@book.publisher = Publisher.new
@book.should have(:no).errors_on(:publisher)
end
it "should have an associated publisher" do
@book.should have_at_least(1).error_on(:publisher)
end
#mtm
it "should be ok with at least one associated author" do
@book.authors.build
@book.should have(:no).errors_on(:authors)
end
it "should have at least one associated author" do
@book.should have_at_least(1).error_on(:authors)
end
end
答案 3 :(得分:1)
remarkable会做得很好:
describe Pricing do
should_have_many :accounts, :through => :account_pricings
should_have_many :account_pricings
should_have_many :job_profiles, :through => :job_profile_pricings
should_have_many :job_profile_pricings
end
通常,您只需将所有关系从模型复制到规范,并将“has”更改为“should_have”,将“belongs_to”更改为“should_belong_to”,依此类推。为了回答它正在测试rails的指控,它还检查数据库,确保关联有效。
还包括用于检查验证的宏:
should_validate_numericality_of :amount, :greater_than_or_equal_to => 0