Railsで統合テストを行っています。任意のIPアドレスからのリクエストを真似したい。これまでのところ、それを行うには2つの方法があることを学びました。
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">.
しかし、上で述べたように、2 番目のアプローチは問題なく機能します。
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 を設定しないのはなぜですか?では、この方法が必要な理由は何ですか?
統合テストでそれを使用することはまだ可能ですか、それとも 2 番目のアプローチが唯一の選択肢ですか?