2012-12-02 12 views
7

Ich habe eine Methode in meinem ApplicationHelper, dass alle Einzelteile in meinem KorbZugriff auf Sitzung von einem Helfer spec in rspec

module ApplicationHelper 
    def has_basket_items? 
    basket = Basket.find(session[:basket_id]) 
    basket ? !basket.basket_items.empty? : false 
    end 
end 

dies hier ist mein Helfer spec, die ich habe zu prüfen sind, ob es überprüft,:

require 'spec_helper' 

describe ApplicationHelper do 
    describe 'has_basket_items?' do 
    describe 'with no basket' do 

     it "should return false" do 
     helper.has_basket_items?.should be_false 
     end 

    end 
    end 
end 

aber wenn ich den Test ausführen ich erhalte

SystemStackError: stack level too deep 
/home/user/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.2.8/lib/action_dispatch/testing/test_process.rb:13: 

Von diesem Debuggen ich sehe, dass Sitzung wird in ActionDispatch :: TestProcess von @ request.session zugegriffen, und @ request ist Null. Wenn ich über meine Anfrage auf die Sitzung zugreife, ist @request eine Instanz von ActionController :: TestRequest.

Meine Frage ist, kann ich auf das Session-Objekt von einer Helper-Spezifikation zugreifen? Wenn ich kann, wie? Und wenn ich nicht weiß, was die beste Methode ist, um diese Methode zu testen?

****UPDATE* ***

Dies war nach unten include ActionDispatch::TestProcess in meinen Fabriken zu haben. Durch das Entfernen dieses Include wird das Problem sortiert.

+3

Verwenden Sie zum Anhängen von Dateien mit FactoryGirl und ohne "ActionDispatch :: TestProcess": 'image {Rack :: Test :: UploadedFile.new ('spec/facilities/test.png', 'image/png')}' , siehe: https://gist.github.com/rugginoso/4079399 und https://github.com/gregbell/active_admin/issues/512 –

Antwort

3

kann ich die Session-Objekt von einem Helfer spec zugreifen?

Ja.

module ApplicationHelper 
    def has_basket_items? 
    raise session.inspect 
    basket = Basket.find(session[:basket_id]) 
    basket ? !basket.basket_items.empty? : false 
    end 
end 

$ rspec spec/helpers/application_helper.rb 

Failure/Error: helper.has_basket_items?.should be_false 
    RuntimeError: 
    {} 

Das Sitzungsobjekt ist da und gibt einen leeren Hash zurück.

Versuchen Sie, das Backtrace genauer zu überprüfen, um den Fehler zu finden. stack level too deep weist normalerweise auf eine schief gegangene Rekursion hin.

+0

Leider gibt das den gleichen Stack zu tief Fehler auch. Das Debuggen der Rekursion wird an die Session-Methode in ActionDispatch :: TestProcess übergeben, die '@ request.session' aufruft und @request ist null. '@ request.session' scheint die Sitzung auf ActionDispatch :: TestProcess aufzurufen, und dies führt zu einer Schleife, bis der Stack zu tief ist. Davon ausgehend denke ich, dass ich irgendwie eine Sitzung in den Helfer einfügen muss, aber ich kann nicht herausfinden, wie. –

+0

Ich habe den Code in meiner Antwort ausgeführt und den leeren Hash als Ausgabe erhalten. Das deutet darauf hin, dass mit Ihrer Umgebung etwas nicht stimmt. Ich würde versuchen, eine saubere Rails in ein neues Projekt zu installieren, um zu sehen, ob das Problem weiterhin besteht. – zetetic

+0

Ok, nach ein paar Experimenten fand ich heraus, dass es das 'factory_girl_rails'-Juwel ist, das meine Kopfschmerzen verursacht, was ziemlich ärgerlich ist, da ich Hunderte von Tests verwende, die es benutzen. Ich werde nachsehen, ob es irgendwelche Korrekturen gibt, sonst sieht es so aus, als müsste ich einen Ersatz für Fabrikmädchen finden. Danke, dass Sie mich in die richtige Richtung weisen. –

1

Sie testen has_basket_items? Aktion in ApplicationHelper, die einen bestimmten Korb mit einer Korb-ID in der Körbe-Tabelle überprüfen, so dass Sie einige Korb-Objekte in Ihrem Test haben sollten, die Sie mit Factory_Girl Gem erstellen können.

Hers ist ein Beispiel: -

basket1 = Factory(:basket, :name => 'basket_1') 
basket2 = Factory(:basket, :name => 'basket_2') 

Sie können weitere Details bekommen Wie factory_girl von diesem Bildschirm http://railscasts.com/episodes/158-factories-not-fixtures geworfen verwenden

Es wird ein Factory-Objekt in der Testdatenbank erstellen. Also, im Grunde können Sie einige Fabrikobjekte erstellen und dann eine basket_id in Sitzung festgelegt für seine Existenz wie dies zu überprüfen:

session[:basket_id] = basket1.id 

Also, Ihr Test so sein sollte: -

require 'spec_helper' 

describe ApplicationHelper do 
    describe 'has_basket_items?' do 
    describe 'with no basket' do 

     it "should return false" do 
     basket1 = Factory(:basket, :name => 'basket_1') 
     basket2 = Factory(:basket, :name => 'basket_2') 
     session[:basket_id] = 1234 # a random basket_id 
     helper.has_basket_items?.should be_false 
     end 

    end 
    end 
end 

Alternativ Sie können für eine basket_id überprüfen, die von factory_girl erstellt wird, indem auf be_true mit:

session[:basket_id] = basket1.id 
helper.has_basket_items?.should be_true 
+0

Ich habe Ihren Vorschlag versucht, aber leider bekomme ich das gleiche Ergebnis. Von dem, was ich sagen kann, scheint dies eher auf die Tatsache zurückzuführen zu sein, dass ein Anfrageobjekt nicht in meinen Helfer injiziert wurde, statt dass die Objekte in der Datenbank nicht existieren. In der Tat sollten keine Basket-Entitäten existieren müssen, damit meine Methode funktioniert. –

Verwandte Themen