我在Rails中进行集成测试。我想模仿来自任意IP地址的请求。到目前为止,我已经了解到有两种方法可以做到:
remote_addr=(remote_ip) ## the first
get("/", nil, {"REMOTE_ADDR" => "999.99.99"}) ## the second
但是第一个在集成测试中不起作用。它没有设置remote_addr
:
test("some integration test") do
r_a = "999.99.99"
puts remote_addr
remote_addr=(r_a) ## neither before get()...
puts remote_addr
get("/") ## get request
remote_addr=(r_a) ## nor after get() it doesn't set remote_addr
assert_equal(r_a, assigns(:r_a)) ## assertion test
end
现在我运行测试。这是结果。请注意前后值的变化:
# Running tests:
127.0.0.1
999.99.99
F
Finished tests in 1.109375s, 0.9014 tests/s, 5.4085 assertions/s.
1) Failure:
test_some_integration_test(UserFlowsTest) [test/integration/user_flows_test.rb:45]:
<"999.99.99"> expected but was
<"127.0.0.1">.
但正如我上面所说,第二种方法运作良好:
test("some integration test") do
r_a = "999.99.99"
puts remote_addr
get("/", nil, {"REMOTE_ADDR" => "999.99.99"})
puts remote_addr
assert_equal(r_a, assigns(:r_a)) ## assertion test
puts "assigns(:r_a) = #{assigns(:r_a)}"
end
结果。请注意,remote_addr()
中的值未更改,但在assigns(:r_a)
中已更改:
# Running tests:
127.0.0.1
127.0.0.1
assigns(:r_a) = 999.99.99
.
Finished tests in 1.296875s, 0.7711 tests/s, 7.7108 assertions/s.
remote_addr=的源代码是:
# File actionpack/lib/action_dispatch/testing/test_request.rb, line 55
def remote_addr=(addr)
@env['REMOTE_ADDR'] = addr
end
它必须改变,但事实并非如此。
为什么remote_addr=
未在集成测试中设置remote_ip?
那么该方法需要什么?
是否仍然可以在集成测试中使用它,或者第二种方法是唯一的选择?
答案 0 :(得分:2)
由于我已经写了很多问题,我在这里发布了一些更新。
如果您的集成测试具有操作重定向(例如,来自create
操作reditect_to("show")
操作)并且您模仿来自的请求,请不要在集成测试中使用 follow_redirect!() 任意IP(env['REMOTE_ADDR']
)。因此,您希望在两个操作中保持相同的remote_addr
。
follow_redirect!()
不会保留env['REMOTE_ADDR']
设置。 {red} {/ p>重置了env['REMOTE_ADDR']
。
而是使用request_via_redirect()方法。这样,例如:
# your redirection assertion...
assert_response(:redirect)
# is followed by this
request_via_redirect("GET",
url_for(:action => "show", :id => assigns(:model).id),
nil,
{"REMOTE_ADDR" => "999.99.99"})
使用此方法,您可以将env['REMOTE_ADDR']
设置转发到下一个操作。