根据客户端的 IP 地址,我的应用程序中的某些功能会有所不同。有没有办法在 Rails 功能测试中进行测试?我正在使用 Test::Unit 和 Shoulda。
问问题
6217 次
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 回答
0
使用 gem "mocha" 你可以:
test "should something" do
request.expects(:remote_ip).returns("189.81.139.183")
...
end
于 2012-07-05T13:47:38.817 回答