15

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

4

4 回答 4

32

通过在控制器调用之前更改 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
于 2010-01-19T05:11:49.867 回答
1

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

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

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

于 2010-01-19T04:26:53.417 回答
1

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

我会在FakeWeb上寻求帮助。它使您可以轻松设置预期的请求/响应。看看 Rails 本身是如何进行这些测试的可能也很有启发性。

于 2010-01-19T04:32:30.050 回答
0

使用 gem "mocha" 你可以:

test "should something" do
  request.expects(:remote_ip).returns("189.81.139.183")
  ...
end
于 2012-07-05T13:47:38.817 回答