【问题标题】:In Rails controller tests, Is there a way to simulate a specific remote IP?在 Rails 控制器测试中,有没有办法模拟特定的远程 IP?
【发布时间】:2011-01-06 15:35:36
【问题描述】:

根据客户端的 IP 地址,我的应用程序中的某些功能会有所不同。有没有办法在 Rails 功能测试中进行测试?我正在使用 Test::Unit 和 Shoulda。

【问题讨论】:

    标签: ruby-on-rails unit-testing testing bdd shoulda


    【解决方案1】:

    使用 gem "mocha" 你可以做到:

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

    【讨论】:

      【解决方案2】:

      通过在调用控制器之前更改 REMOTE_ADDR 环境变量,您无需存根即可轻松完成此操作。这是一个虚构的控制器,如果用户的 IP 地址是 1.2.3.4,它会将用户重定向到主路径:

      def index
        if request.remote_ip == '1.2.3.4'
          redirect_to root_path
          return
        end
      
        @articles = Article.all
      end
      

      您可以通过以下方式测试它是否有效:

      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
      

      您在控制器调用之前设置了远程 IP,因此您可以在没有任何特殊插件或 gem 的情况下伪造该数据。这是 ItemsController 的 shoulda 版本:

      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
      

      【讨论】:

        【解决方案3】:

        您应该能够通过存根请求并返回一个 request.remote_ip 等于所需 IP 地址的模拟对象来完成此操作。

        我会向FakeWeb 寻求帮助。它使您可以轻松设置预期的请求/响应。看看 Rails 本身如何does these kinds of tests 也可能很有启发性。

        【讨论】:

          【解决方案4】:

          接收控制器需要一种方法来检测 IP 地址(或将其作为参数接收),并且您需要一种方法为您的测试注入特定的 IP 地址,或者只是将测试 IP 地址指定为参数给方法。

          如果考虑到您的应用所做的任何事情都不容易,那么您可以将“自定义功能”应用到家庭网络上的另一台计算机(如果有的话),然后以这种方式测试应用。不过,这并不能真正解决“通过单元测试解决”的答案。

          我能问一下为什么您的应用会根据 IP 地址执行特定操作吗?也许还有其他方法。

          【讨论】:

          • 为什么要检测 IP:应用会根据用户是在本地网络内部还是外部显示不同的 UI 元素。
          猜你喜欢
          • 1970-01-01
          • 2015-03-25
          • 1970-01-01
          • 1970-01-01
          • 2011-01-28
          • 2014-01-10
          • 2021-01-05
          • 1970-01-01
          • 2019-02-10
          相关资源
          最近更新 更多