1

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

変わらなければならないのに変わらない。

  1. remote_addr=統合テストで remote_ip を設定しないのはなぜですか?

  2. では、この方法が必要な理由は何ですか?

  3. 統合テストでそれを使用することはまだ可能ですか、それとも 2 番目のアプローチが唯一の選択肢ですか?

4

1 に答える 1

2

質問にかなり書いたので、ここにいくつかの更新を投稿します。

統合テストにアクション リダイレクト (アクションアクションからなど) があり、かつ任意の IP からの要求を模倣している場合 ( )、統合テストでfollow_redirect!()を使用しないでください。したがって、両方のアクションで同じことを維持する必要があります。createreditect_to("show")env['REMOTE_ADDR']remote_addr

follow_redirect!()設定を保持しませんenv['REMOTE_ADDR']env['REMOTE_ADDR']redirected_to アクションでリセットされます。

代わりに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']設定を次のアクションに転送できます。

于 2013-06-05T17:20:02.717 に答える