ale*_*ntd 10 ruby-on-rails functional-testing
我在Rails功能测试中发送POST请求,如下所示:
post :create, collection: { name: 'New Collection' }
Run Code Online (Sandbox Code Playgroud)
collection
按预期,以JSON编码的表单数据发送.
我无法弄清楚的是如何向URL添加查询.文档说我可以访问请求对象并在发送之前对其进行修改.所以我尝试了这个:
@request.GET[:api_key] = 'my key'
post :create, collection: { name: 'New Collection' }
Run Code Online (Sandbox Code Playgroud)
但是,:api_key
永远不会出现在request.GET
服务器上的哈希值中.(但是,当我通过另一个HTTP客户端发送它时,它会这样做.)
Bor*_*aMa 21
首先澄清一些事情:虽然请求不能同时是GET和POST,但是在使用POST时没有什么能阻止你使用查询字符串和正文表单数据.您甚至可以使用查询字符串中的所有参数和空体来进行POST ,尽管这听起来很不寻常.
Rails支持这种情况,实际上您可以使用POST请求轻松发送表单,并且仍然可以在表单的操作中进行查询.查询将使用request.GET
哈希(这是别名query_string
)来访问,而POST主体使用request.POST
哈希(别名request_parameters
)来查询.所述params
散列实际上是从构成组合GET
和POST
散列.
但是,根据我的研究,似乎Rails不支持在功能控制器测试中的POST请求中传递查询字符串.虽然我在github的任何文档或已知问题中找不到任何相关内容,但源代码非常清楚.在下文中,我假设您使用Rails 4.
功能控制器测试的问题在于它们不使用实际请求/响应,但它们模拟HTTP握手:请求被模拟,其参数填充在适当的位置,并且给定的控制器操作被简单地称为普通的ruby方法.所有这些都是在action_controller/test_case
课堂上完成的.
事实证明,由于两个原因,此模拟在您的特定情况下不起作用:
运行测试时传递的参数是总 移交 任一到request_parameters
,即,request.POST
使用时哈希post
请求或向query_string
(即request.GET
对)get
测试的请求.在单次测试运行期间,无法设置这两个哈希值.
这实际上是有道理的get
,因为post
功能测试中的等助手只接受一个params的哈希,因此内部测试代码无法知道如何将它们分成两个哈希.
确实可以在使用@request
变量运行测试之前设置请求,但仅在某种程度上,您可以设置标题.但是您无法设置请求的内部属性,因为它们在测试运行期间被回收.回收在这里完成,它重置请求对象和底层机架请求对象的所有内部变量.因此,如果您尝试设置这样的请求GET参数@request.GET[:api_key] = 'my key'
,它将不会产生任何影响,因为表示此哈希的内部变量将在回收期间被擦除.
放弃功能测试并选择集成测试.集成测试允许将机架环境变量与主要参数分开设置.以下集成测试QUERY_STRING
除了正常的post body params之外还传递rack env变量,并且应该完美地工作:
class CollectionsTest < ActionDispatch::IntegrationTest
test 'foo' do
post collections_path, { collection: { name: 'New Collection' } },
{ "QUERY_STRING" => "api_key=my_api_key" }
# this proves that the parameters are recognized separately in the controller
# (you can test this in you controller as well as here in the test):
puts request.POST.inspect
# => {"collection"=>{"name"=>"New Collection"}}
puts request.GET.inspect
# => {"api_key"=>"my_api_key"}
end
end
Run Code Online (Sandbox Code Playgroud)
您仍然可以在集成测试中使用功能测试的大多数功能.例如,您可以使用assigns
散列测试控制器中已分配的实例变量.
转换参数也受到以下事实的支持:Rails 5将弃用功能控制器测试以支持集成测试,并且由于Rails 5.1这些功能测试支持将被移出到单独的gem.
试试Rails 5:虽然功能测试将被弃用,但它的源代码似乎已经在rails master中大量重写,例如,不再使用请求的回收.因此,您可以尝试尝试在测试设置期间设置请求的内部变量.我没有测试过它.
当然,您总是可以尝试对功能测试进行猴子修补,以便它支持在测试中定义query_string
和request_parameters
散列的单独参数.
我去集成测试路线:).
归档时间: |
|
查看次数: |
11976 次 |
最近记录: |