2008-11-21 6 views
1

J'essaye d'écrire un test rspec pour un contrôleur qui accède à un groupe modèle .foo_url (mock_foo) ne fonctionne parfois pas dans les tests rspec

 
@request.env['HTTP_REFERER'] = group_url(@mock_group) ### Line 49 

Je reçois ceci:

 
NoMethodError in 'ActsController responding to create should redirect to :back' 
You have a nil object when you didn't expect it! 
The error occurred while evaluating nil.rewrite 
/Library/Ruby/Gems/1.8/gems/actionpack-2.1.0/lib/action_controller/base.rb:621:in `url_for' 
(eval):17:in `group_url' 
/Library/Ruby/Gems/1.8/gems/actionpack-2.1.0/lib/action_controller/test_process.rb:464:in `send!' 
/Library/Ruby/Gems/1.8/gems/actionpack-2.1.0/lib/action_controller/test_process.rb:464:in `method_missing' 

Cette ligne url_for est le problème; specifiquement @url est nul.

 
@url.rewrite(rewrite_options(options)) 

Et il semble que @url est initialisé ici: Regardez

 
def initialize_current_url 
    @url = UrlRewriter.new(request, params.clone) 
end 

Répondre

3

Cela se produit parce url_for dépend des choses qui est initialisé au cours du traitement de la demande. Je suppose que votre test ressemble à ceci:

it "should do whatever when referrer is group thing" do 
    @request.env["HTTP_REFERER"] = url_for(@mock_group) 
    get :some_action 
    "something".should == "something" 
end 

url_for échoue car il arrive avant l'obtention. Le moyen le plus simple de résoudre le problème consiste à coder en dur l'URL dans votre test (par exemple, remplacez url\_for(@mock\_group) par "http://test.host/group/1"). L'autre option consiste à trouver comment obtenir @controller pour initialiser @url avant d'appeler url_for. Je pense que je l'ai déjà fait, mais je n'ai plus le code et il faut creuser le code d'action_controller.

Questions connexes