Rspec before(:each)有效,但before(:all)不起作用

时间:2018-12-18 08:03:07

标签: ruby-on-rails rspec ruby-on-rails-5 factory-bot

我的ProductCategory规格:-

require 'rails_helper'

RSpec.describe ProductCategory, type: :model do
    before(:each) do 
        @product_category = create(:product_category)
    end

  context "validations" do 
    it "should have valid factory" do
        expect(@product_category).to be_valid
    end

    it "should have unique name" do 
        product_category_new = build(:product_category, name: @product_category.name)
        expect(product_category_new.save).to be false
    end
  end
end

该规范运行良好,但是当我使用before(:all)而不是before(:each)时,第二个示例将失败-
expected false got true我知道before(:all)和before(:each)之间的区别,但是我无法找到第二个示例使用before(:all)失败的确切原因

1 个答案:

答案 0 :(得分:3)

before :all仅在所有示例之前运行一次,因此@product_category仅创建一次。如果在每次测试后都运行诸如DatabaseCleaner截断之类的操作,则该记录将不再在第二次测试的数据库中,从而通过了验证。

另一方面,

before :each将在每个示例之前运行,因此即使在此期间数据库被清理,记录也将在第二个示例中存在。