2009-07-16 8 views
5

Je précise les default_url_options dans mes environnements/test.rb avecdefault_url_options de concombre [: hôte] chaque fois que "www.example.com", même si cela est spécifié dans environtemnts/test.rb

config.action_mailer.default_url_options = { :host => "www.xyu.at" } 

Ceci est tout à fait correct et dans mon histoire de concombre, où je teste l'enregistrement des utilisateurs, le lien d'activation utilisateur est généré droit

invitation_activation_url(1) 
=> "www.xyu.at/signup/1231hj23jh23" 

Mais lorsque je tente de suivre le lien fourni dans l'e-mail avec le code suivant dans les caractéristiques/étapes/user_steps. rb (en utilisant email-rspec de http://github.com/bmabey/email-spec/tree/master):

When /^I follow the invitation link$/ do 
    When 'I follow "'+invitation_activation_url(1) + '" in the email' 
end 

Ici, l'URL est créée avec la valeur par défaut hôte:

invitation_activation_url(1) 
=> "www.example.com/signup/1231hj23jh23" 

Quelqu'un peut-il me aider? Je ne comprends pas ce que je fais mal ....

Merci!

EDIT:

Il semble voir avec la méthode

current_url 

, mais je ne sais pas d'où il vient ..?

EDIT:

Et je le bon environnement spécifié dans mes traits/support/env.rb

ENV["RAILS_ENV"] ||= "test" 

EDIT:

Ma solution temporaire est, ce edbond dit,

invitation_activation_url(1, :host => "www.xyz.at") 
    => "www.xyz.at/signup/1231hj23jh23" 

mais je ne veux pas nommer le domaine explicite de cette façon (i spécifié déjà dans mon environnement/fichier test.rb - de cette façon ce ne serait pas sec)

Répondre

1

Utilisez: option d'hôte dans votre URL.

invitation_activation_url(1, :host => "www.xyz.at") 
    => "www.xyz.at/signup/1231hj23jh23" 

EDIT:

Vous pouvez analyser le corps de courrier électronique et obtenir le lien

mail = YourMailer.deliveries.last 
    email_html = Nokogiri::HTML mail.body.to_s 
    approve_link = email_html.at_css("a")["href"] 
+1

Oui, thats ma solution temporaire. Mais je ne veux pas nommer explicitement le domaine de cette façon (-> la duplication, comme je l'ai déjà configuré environnements/test.rb!) – Lichtamberg

+0

Comme le dit Lichtamberg, ceci est une solution de contournement unique si vous avez besoin d'un seul appel à un route helper pour travailler. Mais ce n'est pas une solution générale, et serait une pratique lourde et mauvaise pour essayer de l'implémenter pour une application de toute complexité. – Raphael

0

Vous dites que vous config édité/environnement/test. rb. Etes-vous sûr que vos fonctionnalités de concombre s'exécutent réellement dans l'environnement 'test'?

J'ai récemment ajouté Cucumber à un projet sur lequel je travaille, et il semble s'être configuré pour utiliser un environnement de 'concombre' par défaut.

Dans caractéristiques/support/env.rb dans mon projet il y a ceci:

ENV["RAILS_ENV"] ||= "cucumber" 

Donc, si votre projet est similaire, alors vous aurez besoin de personnaliser et config/environnements/cucumber.rb.

+0

Oui, j'ai changé déjà à: ENV [ "RAILS_ENV"] || = "test" – Lichtamberg

0

Je ne suis pas terriblement familier avec concombre, donc je ne peux pas dire avec certitude où exactement vous Je vais devoir appliquer cette correction. Mais le problème est que default_url_options n'est pas défini dans un autre endroit où vous essayez de générer votre URL ...

Donc, mon conseil est de savoir d'abord dans quel contexte l'URL défectueuse est générée. Avant ou après, il suffit de sortir self.class. C'est la classe que tu vas devoir appliquer à Monkey-Patch. Pour l'exemple, disons que "ClassName" a été imprimé.

Lorsque vous avez, dans votre config/environnements/test.rb, il suffit d'ajouter l'accesseur d'attribut, puis réglez-le sur ce que vous voulez:

class ClassName 
    cattr_accessor :default_url_options 
    # or mattr_ if it's a module 
end 

puis il mis la même manière que votre actionmailer

ClassName.default_url_options = { :host => "www.xyu.at" } 

Ce processus peut être utile aussi bien quand vous voulez générer urls dans les modèles ou dans d'autres endroits ésotériques (vous aurez également besoin d'inclure ActionController :: UrlWriter).

+0

Peut-il être - que c'est un bug webrat? – Lichtamberg

0

Une solution (basée sur les informations here) est d'avoir une définition étape comme

Given /^the domain "(.+?)"$/ do |domain| 
    host! domain 
end 

et de l'utiliser comme

Given the domain "www.foo.com" 

en fonctions. Avec cela, cependant, j'ai rencontré des problèmes où les redirections n'ont pas été suivies. J'ai essayé d'appliquer this patch mais je n'ai pas eu de chance.

J'ai fini à l'aide d'une solution très simple dans le fichier env.rb de concombre:

# There is a bug in internal_redirect? when used with explicit (non-example.com) domains. 
# This is a simple workaround but may break if we start specing external redirects. 
# https://webrat.lighthouseapp.com/projects/10503/tickets/140-current_url-should-be-fully-qualified 
class Webrat::Session 
    alias internal_redirect? redirect? 
end 

Comme mentionné dans le commentaire, cette mai pause cours avec les redirections externes, mais nous avons pas.

1

Je connais ses années depuis que cela a été posté .. mais j'ai eu ce problème et m'a pris des heures à déchiffrer jusqu'à ce que je l'ai compris.

Vous devez utiliser à la place

When /^I follow the invitation link$/ do 
    When 'I follow "'+invitation_activation_path(1) + '" in the email' 
end 

le _url génère le chemin d'URL; tandis que le _path génère le chemin de l'URI. web_steps.rb utilise l'URI pour déterminer le current_url qu'il utilise pour élaborer l'hôte.

de http://api.rubyonrails.org/classes/ActionDispatch/Routing.html

Les itinéraires peuvent être nommés par le passage d'un: en option, ce qui permet facilement au sein de votre référence comme source name_of_route_url pour l'URL complète et name_of_route_path pour le chemin URI.

de web_steps.rb

Then /^(?:|I)should be on (.+)$/ do |page_name|                                  | #  end                                           
    current_path = URI.parse(current_url).path                                   | #                                             
    if current_path.respond_to? :should                                    | #  collection do                                         
    current_path.should == path_to(page_name)                                  | #  get 'sold'                                         
    else                                            | #  end                                           
    assert_equal path_to(page_name), current_path                                 | # end                                            
    end                                            | 
end 
Questions connexes