1

我正在 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

它必须改变,但事实并非如此。

  1. 为什么remote_addr=不在集成测试中设置 remote_ip?

  2. 那么这个方法需要什么?

  3. 是否仍然可以在集成测试中使用它,或者第二种方法是唯一的选择?

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 回答