2012-08-13 56 views
4

应客户的要求,每当应用程序检测到来自不同IP地址的同一用户的两个活动会话时,我必须实施通知电子邮件。你如何测试这个?如何在Rails中测试多个IP地址的登录

+1

+1我没有这方面的实际用途,但我真的很感兴趣的答案:) – 2012-08-13 23:36:16

回答

1

创建集成测试的测试/集成/ multiple_ip_test.rb

require 'test_helper' 

@@default_ip = "127.0.0.1" 

class ActionController::Request 
    def remote_ip 
    @@default_ip 
    end 
end 

class MultipleIpTest < ActionDispatch::IntegrationTest 
    fixtures :all 

    test "send email notification if login from different ip address" do 
    post_via_redirect login_path, 
         :user => {:username => "john", :password => "test"} 
    assert_equal "https://stackoverflow.com/users/john", path 

    reset! 
    @@default_ip = "200.1.1.1" 
    post_via_redirect login_path, 
         :user => {:username => "john", :password => "test"} 
    assert_equal "https://stackoverflow.com/users/john", path 
    assert_equal 1, ActionMailer::Base.deliveries.size 
    end 
end 

集成测试看上去很像功能测试,但也有一些差异。您不能使用@request来更改原始IP地址。这就是为什么我必须打开ActionController::Request类并重新定义remote_ip方法。

因为对post_via_redirect的响应始终为200,而不是使用assert_response :redirect,所以我使用URL来验证用户是否已成功登录。

致电reset!是开始新会话所必需的。

有关集成测试的介绍,请在测试中检查Rails Guides,但不幸的是,他们没有提及reset!方法。

+0

我不能得到这个解决方案(或任何我试过的排列)工作。我没有得到任何错误,但是当我运行测试时,它不显示正确的IP。 (我试图编写一个测试来验证Devise为其“可跟踪”功能记录正确的远程IP)。 – 2015-03-17 15:45:54

+0

也许Devise正在从不同的地方获取IP地址? ActionDispatch实现'request.remote_ip'和'request.ip'。这[SO问题](http://stackoverflow.com/questions/10997005/whats-the-difference-between-request-remote-ip-and-request-ip-in-rails)解释了这种差异。我会检查Devise的源代码,他们甚至可能会绕过这两种方法。 – 2015-04-11 19:15:46

0

假设你使用的是一些框架,在这样的记录作为色器件,以下命令将获得一台机器的IP远程访问你的应用程序:

request.remote_ip 

您需要将自己使用过的IP地址存储在模型那么你应该很容易知道他们是否使用不同的IP访问。

迈克尔G.