2016-05-10 5 views
0

Ich habe ein seltsames Problem. Ich habe eine Factory user_deals für einen Benutzer/Deal has_many/has_many Beziehung erstellt, aber es scheint wie rspec zwingt mich nun einen Benutzer zu behaupten, auch wenn ich keinen brauche (in der Tat Benutzer werden nur in meiner Datenbank geloggt und benötigt in der App, wenn ein Web-Besucher anmeldet)Problem mit Fabrik Mädchen Verein und Verwendung von:

Dieser Test funktioniert nicht:

context "As NON SIGNED-IN visitor" do  

    describe "HP card has the right content and behavior on small screens (1-column view)", :js => true do  

     let(:subject) { ApplicationController.new } 
     let(:deal_for_german_people) { create(:deal_skips_validate, 
               :country   => "Germany", 
               :title   => "title of deal for German people") } 
let(:deal_for_german_people2) { create(:deal_skips_validate, 
               :country   => "Germany", 
               :title   => "title 2 of deal for German people") } 

     before do 
     resize_window_to_mobile    
     end 

     after do 
     resize_window_default 
     end 

     it "plus and minus icons behave correctly" do 
     visit root_path 
     # user sees on mobile the little "plus" icon by default 
     expect(page).to have_css('.card-detail-opener', visible: true) 
    end 

end 

Aber wenn ich erstellen (Add: user) und ich schaffen "user_deals", hat der Test. Aber ich bin im Kontext "nicht angemeldeter Benutzer", also warum sollte ich einen Benutzer und user_deals erstellen?

context "As NON SIGNED-IN visitor" do  

    describe "HP card has the right content and behavior on small screens (1-column view)", :js => true do  

     let(:subject) { ApplicationController.new } 
     let(:user)     { create(:user, 
               user_country_name: 'Germany') } 
     let(:deal_for_german_people) { create(:deal_skips_validate, 
               :country   => "Germany", 
               :title   => "title of deal for German people") } 
let(:deal_for_german_people2) { create(:deal_skips_validate, 
               :country   => "Germany", 
               :title   => "title 2 of deal for German people") } 

     before do 
     resize_window_to_mobile 
     create(:user_deal, user: user, deal: deal_for_german_people) 
     create(:user_deal, user: user, deal: deal_for_german_people2) 
     end 

     after do 
     resize_window_default 
     end 

     it "plus and minus icons behave correctly" do 
     visit root_path 
     # user sees on mobile the little "plus" icon by default 
     expect(page).to have_css('.card-detail-opener', visible: true) 
    end 

end 

auch noch den Grund dieser Seltsamkeit zu untersuchen, fand ich heraus, dass, wenn ich das „lassen:“ nicht verwenden, zu Beginn des Tests, sondern Variablen @deals innerhalb th bevor erstellen .. .do Block, funktioniert es ohne einen Benutzer zu schaffen (aber ich möchte rspec verwenden "lassen" rspec best practices trocknen und gelten)

describe "HP card has the right content and behavior on small screens (1-column view)", :js => true do  


    let(:subject) { ApplicationController.new }  

     before do 
     resize_window_to_mobile 

     @deal_for_german_people = FactoryGirl.build(:deal, 

                 :country   => "Germany", 
                 :title   => "title of deal for German people").save(validate: false) 
@deal_for_german_people2 = FactoryGirl.build(:deal, 

                 :country   => "Germany", 
                 :title   => "title 2 of deal for German people").save(validate: false) 
     end 

     after do 
     resize_window_default 
     end 

     it "plus and minus icons behave correctly" do 
     visit root_path 
     expect(page).to have_css('.card-detail-opener', visible: true) 
     end 

Modelle

class Deal < ActiveRecord::Base 
    has_many :user_deals,   dependent: :destroy 
    has_many :users,    through: :user_deals 
end 

class User < ActiveRecord::Base 
    has_many :user_deals   
    has_many :deals,    through: :user_deals 
end 

class UserDeal < ActiveRecord::Base 
    belongs_to :user,   :foreign_key => 'user_id' 
    belongs_to :deal,   :foreign_key => 'deal_id' 
end 

Struktur der Tabelle user_deals

# Table name: user_deals 
# 
# id     :integer   not null, primary key 
# user_id   :integer 
# deal_id   :integer 
# number_of_clicks :integer   default(0) 
# created_at   :datetime 
# updated_at   :datetime 

Fabrik Benutzer

FactoryGirl.define do 
    factory :user do 
    sequence(:email) { |n| "person#{n}@example.com" } 

    password "vddfdf" 
    password_confirmation "vddfdf" 

    confirmed_at Time.now 
    confirmation_token nil 

    trait :superadmin do 
     role :superadmin 
    end 

    trait :with_deals do 
     after(:create) do |user| 
     create_list(:deal, 5, user: user) 
     end 
    end 
    end 
end 

Fabrik user_deal

FactoryGirl.define do 
    factory :user_deal do 
    association :user 
    association :deal 

    trait :few_clicks do 
     number_of_clicks 1 
    end 

    trait :many_clicks do 
     number_of_clicks 4 
    end 
    end 
end 
+0

, was der Fehler in rspec in Ihrem "Dieser Test ist nicht arbeiten:" gezeigt wurde –

Antwort

1

Meine Vermutung ist, dass Sie erwarten beide

let(:deal_for_german_people) ... 
let(:deal_for_german_people2) ... 

sein creat Ed vor dem it Block. In Ihrem ersten Fehlerszenario ist dies jedoch nicht der Fall, da Sie diese Variablen in keinem Teil des Blocks it aufgerufen/verwendet haben. Sie sollten die Variablen let so behandeln, als ob Code darauf wartet, ausgeführt zu werden.

Ich denke, was Sie wollen, ist let!, die sofort ausgeführt wird.

Nachfolgend könnte dann arbeiten

context "As NON SIGNED-IN visitor" do  
    describe "HP card has the right content and behavior on small screens (1-column view)", :js => true do  
    ... 
    let!(:deal_for_german_people) { create(:deal_skips_validate, 
               :country   => "Germany", 
               :title   => "title of deal for German people") } 
    let!(:deal_for_german_people2) { create(:deal_skips_validate, 
               :country   => "Germany", 
               :title   => "title 2 of deal for German people") } 
    ... 
    end 
end 
+0

Dank. Ich werde die Fehlerausgabe liefern und diese morgen testen – Mathieu

+0

Dank hat gut funktioniert – Mathieu