Ruby on rails 检查RSpec中的ActiveRecord关联
我正在学习如何使用Rspec编写测试用例。我有一个简单的帖子评论脚手架,一篇帖子可以有很多评论。我正在使用Rspec进行测试。我应该如何检查Ruby on rails 检查RSpec中的ActiveRecord关联,ruby-on-rails,testing,rspec,bdd,Ruby On Rails,Testing,Rspec,Bdd,我正在学习如何使用Rspec编写测试用例。我有一个简单的帖子评论脚手架,一篇帖子可以有很多评论。我正在使用Rspec进行测试。我应该如何检查Post:has\u many:comments。我应该存根Post.comments方法,然后通过返回comment对象数组的模拟对象来检查它吗?是否真的需要测试AR关联?大多数人不测试关联,因为Rails已经有了单元测试来确保这些方法正常工作。如果您正在做一些复杂的事情,比如涉及一个proc或其他东西,您可能需要显式地测试它。通常你可以通过做一些事情来做
Post:has\u many:comments
。我应该存根Post.comments
方法,然后通过返回comment对象数组的模拟对象来检查它吗?是否真的需要测试AR关联?大多数人不测试关联,因为Rails已经有了单元测试来确保这些方法正常工作。如果您正在做一些复杂的事情,比如涉及一个proc或其他东西,您可能需要显式地测试它。通常你可以通过做一些事情来做到这一点
a = Post.new
a.comments << Comment.new
assert a.save
assert a.comments.size == 1
a=Post.new
a、 注释由于ActiveRecord关联应该由Rails测试套件进行良好的测试(事实确实如此),大多数人并不觉得有必要确保它们工作正常——只是假设它们会工作
如果您想确保您的模型使用了这些关联,那么这是不同的,并且您想要测试这一点并没有错。我喜欢用宝石做这个。它可以让你做一些整洁的事情,比如:
describe Post do
it { should have_many(:comments).dependent(:destroy) }
end
测试关联通常是一种很好的实践,特别是在TDD受到高度重视的环境中——其他开发人员通常会在查看相应的代码之前查看您的规范。测试关联可以确保spec文件最准确地反映代码
有两种方法可以测试关联:
与FactoryGirl:
expect { FactoryGirl.create(:post).comments }.to_not raise_error
这是一个相对肤浅的测试,将在工厂中进行:
factory :post do
title { "Top 10 Reasons why Antelope are Nosy Creatures" }
end
如果您的模型缺少与注释关联的,则返回一个命名错误
您可以使用ActiveRecord方法更深入地查看您的关联。例如,与更复杂的关联:
class Post
has_many :comments, through: :user_comments, source: :commentary
end
reflection = Post.reflect_on_association(:comment)
reflection.macro.should eq :has_many
reflection.options[:through].should eq :user_comments
reflection.options[:source].should eq :commentary
您可以更深入地了解您的关联:
class Post
has_many :comments, through: :user_comments, source: :commentary
end
reflection = Post.reflect_on_association(:comment)
reflection.macro.should eq :has_many
reflection.options[:through].should eq :user_comments
reflection.options[:source].should eq :commentary
并测试任何相关的选项或条件
如果您不想使用外部gem来测试您的关联(有关详细信息,请参阅),另一个选项是使用获取相关关联的AssociationReflection
对象,然后断言:
describe Post do
it "should destroy its comments when it is destroyed" do
association = Post.reflect_on_association(:comments)
expect(association).to_not be_nil
expect(association.options[:dependent]).to eq :destroy
end
end
我给你打了一部分。我是测试新手。假设我编写了一个单元测试,以验证删除相关帖子时是否删除了所有评论。那么这就足够了?此外,我甚至需要编写一个单元测试来验证脚手架生成的销毁方法。哇,仔细检查一下。我是说应该是宝石,不是工厂女孩。