Ruby on rails 检查RSpec中的ActiveRecord关联

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或其他东西,您可能需要显式地测试它。通常你可以通过做一些事情来做

我正在学习如何使用Rspec编写测试用例。我有一个简单的帖子评论脚手架,一篇帖子可以有很多评论。我正在使用Rspec进行测试。我应该如何检查
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
    

    我给你打了一部分。我是测试新手。假设我编写了一个单元测试,以验证删除相关帖子时是否删除了所有评论。那么这就足够了?此外,我甚至需要编写一个单元测试来验证脚手架生成的销毁方法。哇,仔细检查一下。我是说应该是宝石,不是工厂女孩。