代码之家  ›  专栏  ›  技术社区  ›  Umesh Malhotra

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

  •  1
  • Umesh Malhotra  · 技术社区  · 6 年前

    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 回复  |  直到 6 年前
        1
  •  3
  •   eikes    6 年前

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

    before :each 另一方面,将在每个示例之前运行,因此即使同时清理了数据库,记录也会在第二个示例中出现。