Certaines fonctionnalités de mon application fonctionnent différemment selon l'adresse IP du client. Existe-t-il un moyen de tester cela dans les tests fonctionnels de Rails ? J'utilise Test::Unit et Shoulda.
Réponses
Trop de publicités?Vous pouvez le faire facilement sans stubbing, en modifiant la variable d'environnement REMOTE_ADDR avant l'appel de votre contrôleur. Voici un contrôleur fictif qui redirige l'utilisateur vers le chemin de la maison si son adresse IP est 1.2.3.4 :
def index
if request.remote_ip == '1.2.3.4'
redirect_to root_path
return
end
@articles = Article.all
end
Voici comment vous pouvez vérifier que cela fonctionne :
def test_should_reject_ip_1_2_3_4
@request.env['REMOTE_ADDR'] = '1.2.3.4'
get :index
assert_redirected_to root_path
end
Vous définissez l'adresse IP distante avant l'appel du contrôleur, de sorte que vous êtes en mesure de simuler ces données sans plugins ou gems spéciaux. Et voici la version qui aurait dû être utilisée, pour ItemsController :
context "with ip 1.2.3.4" do
setup do
@request.env['REMOTE_ADDR'] = '1.2.3.4'
get :index
end
should_not_assign_to :items
should_redirect_to("home"){home_path}
should_not_set_the_flash
end
Le contrôleur récepteur a besoin d'une méthode pour détecter l'adresse IP (ou la recevoir en tant que paramètre), et vous devez pouvoir injecter une adresse IP spécifique pour votre test, ou simplement spécifier l'adresse IP du test en tant que paramètre de la méthode.
Si ce n'est pas facile compte tenu de ce que fait votre application, vous pouvez faire en sorte que la "fonctionnalité personnalisée" s'applique à un autre ordinateur de votre réseau domestique, si vous en avez un, et tester l'application de cette façon. Mais cela ne résout pas vraiment la question de la "résolution par un test unitaire".
Puis-je demander pourquoi votre application effectuerait une action spécifique en fonction de l'adresse IP ? Il y a peut-être un autre moyen.
Vous devriez être en mesure d'accomplir ceci en bloquant les demandes et en retournant un objet fantaisie qui a request.remote_ip
égal à l'adresse IP souhaitée.
Je regarderais FakeWeb pour de l'aide à ce sujet. Il vous permet de configurer facilement les demandes/réponses attendues. Il peut également être instructif d'examiner la manière dont Rails lui-même fait ce genre de tests .