【发布时间】:2011-01-06 15:35:36
【问题描述】:
根据客户端的 IP 地址,我的应用程序中的某些功能会有所不同。有没有办法在 Rails 功能测试中进行测试?我正在使用 Test::Unit 和 Shoulda。
【问题讨论】:
标签: ruby-on-rails unit-testing testing bdd shoulda
根据客户端的 IP 地址,我的应用程序中的某些功能会有所不同。有没有办法在 Rails 功能测试中进行测试?我正在使用 Test::Unit 和 Shoulda。
【问题讨论】:
标签: ruby-on-rails unit-testing testing bdd shoulda
使用 gem "mocha" 你可以做到:
test "should something" do
request.expects(:remote_ip).returns("189.81.139.183")
...
end
【讨论】:
通过在调用控制器之前更改 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
【讨论】:
您应该能够通过存根请求并返回一个 request.remote_ip 等于所需 IP 地址的模拟对象来完成此操作。
我会向FakeWeb 寻求帮助。它使您可以轻松设置预期的请求/响应。看看 Rails 本身如何does these kinds of tests 也可能很有启发性。
【讨论】:
接收控制器需要一种方法来检测 IP 地址(或将其作为参数接收),并且您需要一种方法为您的测试注入特定的 IP 地址,或者只是将测试 IP 地址指定为参数给方法。
如果考虑到您的应用所做的任何事情都不容易,那么您可以将“自定义功能”应用到家庭网络上的另一台计算机(如果有的话),然后以这种方式测试应用。不过,这并不能真正解决“通过单元测试解决”的答案。
我能问一下为什么您的应用会根据 IP 地址执行特定操作吗?也许还有其他方法。
【讨论】: