为什么不创建这些 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)>'
错误是我实际上并没有通过将它们声明为 let
s 来创建多个引号。将我想要创建的引号移动到一个 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
这里的问题是您正在使用 let
。 let
是延迟求值的,所以直到第一次在测试中引用该对象时才真正创建该对象。由于您从不在测试中引用引用对象,因此它们永远不会被创建。要始终创建对象,请使用 let!
而不是 let
我正在尝试测试索引视图中所有模型对象的存在,索引在浏览器使用中使用手动呈现得很好,所以问题一定出在我的 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)>'
错误是我实际上并没有通过将它们声明为 let
s 来创建多个引号。将我想要创建的引号移动到一个 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
这里的问题是您正在使用 let
。 let
是延迟求值的,所以直到第一次在测试中引用该对象时才真正创建该对象。由于您从不在测试中引用引用对象,因此它们永远不会被创建。要始终创建对象,请使用 let!
而不是 let