2011-01-11 10 views
14

Il mio codice di supporto si presenta così (e funziona bene btw):aiutanti test in Rails 3 con Rspec 2 e mettere a punto

module ProvidersHelper 
    def call_to_review(provider) 
    if user_signed_in? && review = Review.find_by_provider_id_and_user_id(provider.id, current_user.id) 
     link_to "Edit Your Review", edit_provider_review_path(provider, review), :class => "call_to_review" 
    else 
     link_to "Review This Provider", new_provider_review_path(provider), :class => "call_to_review" 
    end 
    end 
end 

Purtroppo, questo produce il seguente errore quando ho eseguito il mio test:

undefined method `user_signed_in?' for #<ActionView::Base:0x00000106314640> 
# ./app/helpers/providers_helper.rb:3:in `call_to_review' 

Chiaramente il Devise::Controllers::Helpers non viene incluso nei miei helper quando rspec sta eseguendo il test. Qualche suggerimento che potrebbe aiutare questo lavoro?

Edit: per fornire un po 'più di informazioni, la mia spec_helper non ha questo:

config.include Devise::TestHelpers, :type => :controller 
config.include Devise::TestHelpers, :type => :view 
config.include Devise::TestHelpers, :type => :helper 

(Purtroppo, non ho potuto farlo funzionare con :type => [:controller, :view, :helper])

Comunque credo che queste righe aggiungere gli aiutanti di test sign_in(scope, object) (e altri) ai test. Non aggiungono gli helper che effettivamente faranno leva sul tuo controller/codice di visualizzazione.

+0

Anche io sto avendo questo problema.Sono molto interessato alla risposta. Cose come "current_user" non esistono quando eseguo il test. Probabilmente è lo stesso problema che stai riscontrando. Questa è l'unica cosa che non mi piace dei linguaggi dinamici - a volte c'è un sacco di metaprogrammazione e 'magia' in corso ... e non hai idea di cosa devi chiamare per ottenere il risultato desiderato ... così finisci su sprecando un'ora di tempo cercando il metodo da chiamare per fare un test pass, sconfiggendo in questo modo i vantaggi di produttività dell'uso del linguaggio dinamico:/ – egervari

+0

Ecco un altro esempio di questo problema: NameError: variabile locale o metodo non definito 'current_user 'per # egervari

+0

Ho iniziato una taglia per la tua domanda. Spero che la persona che risponde risolva anche il mio problema allo stesso tempo. – egervari

risposta

12

Penso che la filosofia di rspec sia di testare il punto di vista/gli helper/i modelli in totale isolamento il più possibile. Quindi, in questo caso, eliminerei lo user_signed_in? e restituirò false o true ei miei risultati dovrebbero cambiare in modo appropriato. Questo ti offre un test isolato e pulito.

+0

Questa è praticamente l'unica risposta che potrei venire con ... ma perché funziona anche per i controller? Se Rspec vuole che li eliminiamo ... perché vengono forniti i test del controller ma non gli helper? È solo un bug?:/ – egervari

+0

I controller potrebbero essere utilizzati per i test di integrazione, ecco perché (suppongo) sia possibile un ciclo più completo, quindi nei test del controller includo 'Devise :: TestHelpers' e lì funziona. All'interno delle specifiche del controller, è anche possibile eseguire il rendering delle viste (w che in generale non faccio - il più delle volte tendo anche a spegnere tutti gli accessi di ActiveRecord), quindi le viste/helper/... dovrebbero funzionare lì. – nathanvda

+6

Come si eliminano questi in una specifica di supporto? Le poche varianti che ho stanco non hanno funzionato. Gli stub vanno in un blocco precedente? Li metti fuori dall'oggetto helper? –

1

Attualmente stai includendo gli helper del test come suggerito nello wiki?

# spec_helper.rb: 
RSpec.configure do |config| 
    config.include Devise::TestHelpers, :type => :controller 
end 

type sarebbe probabilmente helper nel vostro caso.

+0

Sì, scusa, ho dimenticato di dirlo. Dal mio 'spec_helper.rb':' config.include Devise :: TestHelpers,: type =>: helper' – steve

+0

Non credo che questo lo aggiusterà. Sto avendo lo stesso problema. Il problema è che i riferimenti a "current_user" e simili all'interno dell'helper non esistono ancora quando si esegue il test. – egervari

0

Forse prova a mettere questo è in un prima blocco?

@request.env["devise.mapping"] = :user 
+0

Questo non ha alcun effetto per me :(Prova a fare un test di aiuto in cui un metodo di supporto restituisce semplicemente "utente corrente" .Se puoi far passare questo test, sono sicuro che risolverebbe il mio problema e il suo problema. – egervari

+3

aggiungendo 'def current_user {@user} sembra risolvere il mio problema, ma sembra un po' ridondante per deridere i metodi che escogitare dovrebbe fornire a vostro nome:/ – egervari

0

Questo non è stato risolto per la mia soddisfazione e probabilmente non lo sarà mai. Penso che il miglior work-around per ora sia quello di stub manualmente helper.current_user e qualsiasi altro metodo di Devise che usi nel metodo helper che stai testando.

Sì, Devise fornisce queste funzioni di stub per il controller e le specifiche di visualizzazione. Sospetto che sia qualcosa sulla combinazione di Devise/Rails/Test :: Unit/Rspec che dimostra che questo è difficile per le specifiche helper.

0

il mio test di supporto utilizza Devise e cancan e funziona senza eseguire lo stubing (ma non sono sicuro che sia meglio stub effettivamente tutto).

Ecco l'esempio: https://gist.github.com/shotty01/5317463 ho anche provato ad aggiungere user_signed_in? nel metodo di supporto e andava ancora bene.

sono necessarie le seguenti:

add to spec_helper.rb: 
config.include Devise::TestHelpers, :type => :helper 

mie gemme spec:

rspec (2.10.0) 
rspec-core (2.10.1) 
rspec-expectations (2.10.0) 
rspec-mocks (2.10.1) 
rspec-rails (2.10.1) 

naturalmente si può accedere senza Factory Girl, basta riscrivere le ValidUserHelper metodi per creare direttamente un utente o da infissi.

Problemi correlati