2017-06-07 2 views
0

Ich versuche das Vorhandensein aller Modellobjekte in einer Indexansicht zu testen, index rendert nur gut mit manuellen im Browser verwenden, so muss das Problem mit meiner FactoryGirl-Fabrik sein und oder die Art, wie ich Argumente in die FactoryGirl.create Methode übergeben obwohl mir die Forschung nicht verrät, was genau ich falsch mache, irgendwelche Ideen?Warum werden diese FactoryGirl-Factory-Instanzen nicht erstellt, um diesen Indextest zu bestehen?

Dank

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 

Dies ist die Fehlermeldung, die ich bekommen;

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)>' 
+0

Welchen Fehler erhalten Sie genau? Auch müssen Sie nicht factory2 und quote3 registrieren, rufen Sie einfach create (: quote, ... 'mehrere Male –

+0

Frage Körper aktualisiert. – jbk

Antwort

1

Die hier Problem ist, dass Sie let verwenden. let wird langsam ausgewertet, so dass das Objekt nicht tatsächlich erstellt wird, bis es zum ersten Mal im Test referenziert wird. Da Sie die Angebotsobjekte in Ihrem Test nie referenzieren, werden sie nie erstellt. Damit die Objekte immer erstellt werden, verwenden Sie let! statt let

+0

Jeder Grund, warum' let! 'könnte vorzuziehen sein einen "Vorher" -Block zu schreiben, oder umgekehrt – jbk

+1

Nicht wirklich, aber das Einhalten des einen oder anderen für die Erstellung des Testobjekts macht es für jeden klar, der Ihre Tests in Zukunft liest. Der größte Unterschied ist, dass "Let/Let!" 'erzeugen lokale Methoden für den Zugriff auf die Objekte (' quote') oder müssen Instanzvariablen in vor-Blöcken ('@ quote') verwenden, wenn Sie auf das Element in Ihrem Test zugreifen müssen. –

0

Fehler war, dass ich nicht wirklich war, indem er erklärt, sie als let s die mehrere Angebote zu schaffen. Bewegt die Zitate, die ich in einen vor dem Block erstellt werden soll und alles ist gut, wie unten:

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 
+0

Anstatt die Creates zu verschieben, ändern Sie einfach die' let'-Instanzen in 'Let! 'wie in meiner Antwort erwähnt.Halten Sie Ihre Test-Objekt-Kreationen an einem Ort (alles lassen/lassen! oder alle in einem vor, anstatt in mehrere Typen zu teilen) macht Tests leichter zu lesen –

Verwandte Themen