代码之家  ›  专栏  ›  技术社区  ›  Ethan

在Rails控制器测试中,是否有方法模拟特定的远程IP?

  •  15
  • Ethan  · 技术社区  · 14 年前

    根据客户端的IP地址,我的应用程序中的某些功能工作方式有所不同。在Rails功能测试中有没有一种测试方法?我使用的是test::Unit和Shoulda。

    4 回复  |  直到 12 年前
        1
  •  31
  •   Jaime Bellmyer    14 年前

    通过在控制器调用之前更改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,因此您可以在不使用任何特殊插件或gems的情况下伪造数据。这是Shoulda版本,对于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
    
        2
  •  1
  •   jefflunt    14 年前

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

    如果这不容易考虑你的应用程序做什么,你可以做的就是让“自定义功能”应用到家庭网络上的另一台计算机上,如果你有一台,然后用这种方式测试应用程序。但这并不能真正解决“通过单元测试来解决”的问题。

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

        3
  •  1
  •   zetetic    14 年前

    您应该能够通过删除请求并返回具有 request.remote_ip 等于所需的IP地址。

    我会看看 FakeWeb 寻求帮助。它允许您轻松设置预期的请求/响应。看看铁轨本身的情况也可能很有指导意义。 does these kinds of tests .

        4
  •  0
  •   Leandro Andrade    12 年前

    使用宝石“摩卡”,你可以做到:

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