15 votes

Dans les tests de contrôleurs Rails, existe-t-il un moyen de simuler une IP distante spécifique ?

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.

32voto

Jaime Bellmyer Points 13815

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

1voto

jefflunt Points 20244

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.

1voto

zetetic Points 29261

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 .

0voto

Leandro Andrade Points 103

En utilisant la gemme "moka" vous pouvez le faire :

test "should something" do
  request.expects(:remote_ip).returns("189.81.139.183")
  ...
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X