为什么不创建这些 FactoryGirl 工厂实例来通过此索引测试?

Why are these FactoryGirl factory instances not being created to pass this index test?

我正在尝试测试索引视图中所有模型对象的存在,索引在浏览器使用中使用手动呈现得很好,所以问题一定出在我的 FactoryGirl 工厂或者我将参数传递给它的方式FactoryGirl.create 方法,尽管研究未能向我揭示我到底做错了什么,有什么想法吗?谢谢

quotes.rb

FactoryGirl.define do
  factory :quote do
    prev_cover true
    sequence(:co_name) { |n| "Acme Co #{n}" }
    co_number 9999
    postcode "al1 1aa"
    industry :financial_services
    lives_overseas true
    scheme_start_date "2018-01-01"
    payment_frequency :monthly
    commission_level 12
    gla 1

    factory :quote2 do
    end

    factory :quote3 do
    end
  end
end

quotes_page_spec.rb

    require 'rails_helper'

feature 'index page' do
    let(:user) { FactoryGirl.create(:user) }    
    let(:quote) { FactoryGirl.create(:quote, user: user, co_name: "Co1") }
    let(:quote2) { FactoryGirl.create(:quote, user: user, co_name: "Co2") }
    let(:quote3) { FactoryGirl.create(:quote, user: user, co_name: "Co3") }

    before do
        login_as(user, :scope => :user) 
    end

    scenario 'when user view all their quotes' do
        visit("/quotes")
        expect(page).to have_content("Co1")
        expect(page).to have_content("Co2")
        expect(page).to have_content("Co3")
    end

这是我收到的失败消息;

 1) index page when user view all their quotes
 Failure/Error: expect(page).to have_content("Co1")
   expected to find text "Co1" in "Toggle navigation QuoteEngine My Quotes My Account Sign out"
 # ./spec/features/quotes_page_spec.rb:15:in `block (2 levels) in <top (required)>'

错误是我实际上并没有通过将它们声明为 lets 来创建多个引号。将我想要创建的引号移动到一个 before 块中,一切都很好,如下所示:

let(:user) { FactoryGirl.create(:user) }    

before do
    login_as(user, :scope => :user) 
    FactoryGirl.create(:quote, user: user, co_name: "Co1")
    FactoryGirl.create(:quote, user: user, co_name: "Co2")
    FactoryGirl.create(:quote, user: user, co_name: "Co3")
end

这里的问题是您正在使用 letlet 是延迟求值的,所以直到第一次在测试中引用该对象时才真正创建该对象。由于您从不在测试中引用引用对象,因此它们永远不会被创建。要始终创建对象,请使用 let! 而不是 let