gpt4 book ai didi

ruby-on-rails - 使用 rspec 在 Rails 3.2 中测试 JSON API,使用 Backbone 将发送的精确 PUT/POST 主体

转载 作者:行者123 更新时间:2023-12-04 07:38:49 27 4
gpt4 key购买 nike

我正在尝试为以 Backbone 作为前端的 Rails 3.2 编写的 JSON API 编写一组 rspec 测试。我正在编写的测试专门针对 Rails Controller 。

现在,应用程序本身运行良好。当客户端发出带有正文的 PUT 请求时:

{
"id":1,
"name":"updated product set",
...
}

一切都很好。在后台,Rails 将采用该主体,然后将其转换为:

{
"id":1,
"name":"updated product set",
...
"model_name" => { ... }
}

散列“model_name”指向的位置包含它可以从输入中自动计算出的属性值。一切顺利。

当我尝试来自测试环境的完全相同的请求时,一切都不顺利。如果我创建的哈希与上面的 PUT 正文哈希完全相同,但在 rspec 中:

@update_json = {
"id":1,
"name":"updated product set",
...
}
header "Accept","application/json"
header "Content-type","application/json"
put :update, @update_json

事情根本没有解决。在 Controller 中,如果我检查 params 变量,我会得到:

{ "model_name" => {} }

如果我省略“Content-type”标题行,我得到的是@update_json,但没有创建我在 Controller 中需要的“model_name”映射的 Rails 操作。

我成功运行测试的唯一方法如下:

@update_json = {
:format => "json",
"id":1,
"model_name" => {
"id":1,
"name":"updated product set",
...
}
}
header "Accept","application/json"
put :update, @update_json

但是,这不是真实世界的测试,因为它没有测试将由我的主干前端发送的确切 PUT 主体。

有什么想法吗?

更新:环顾四周,看起来您实际上无法从 rspec 执行真正的 HTTP 请求;它只是被 mock 了。例如,您无法让系统响应 404,因为 Rails 会抛出一个异常,该异常通常会被 Rails 网络堆栈捕获并变成 404,但 Rspec 不会。所以问题看起来比上面的更深......

最佳答案

我遇到了同样的问题。无论我做了什么,或者我以何种方式将内容类型指定为“application/json”,它都行不通。如果网上有建议将内容类型设置为json,我试了一下。我什至同时尝试了它们。

最终,我将其追溯到 ActionController::ParamsWrapper,其中 _wrapper_enabled?总是返回 false(由于 request.content_mime_type 为 nil)。这个解决方案对我有用。我也在寻找要添加的“神奇”参数键,而这确实做到了。

mime_type = mock
mime_type.stub :ref => :json
request.stub :content_mime_type => mime_type
request.accept = 'application/json'
post :create, widget.as_json

值是:

widget.as_json #=> {
"created_at"=>nil,
"description"=>"Description 1 - Quidem nihil quae aliquid sed qui.",
"id"=>nil,
"order"=>1,
"title"=>"Title 1 - ut",
"updated_at"=>nil
}

# params hash in the controller.
params #=> {
"created_at"=>nil,
"description"=>"Description 1 - Quidem nihil quae aliquid sed qui.",
"id"=>nil,
"order"=>"1",
"title"=>"Title 1 - ut",
"updated_at"=>nil,
"controller"=>"api/widgets",
"action"=>"create",
"widget"=>{
"title"=>"Title 1 - ut",
"order"=>"1",
"description"=>"Description 1 - Quidem nihil quae aliquid sed qui."
}
}

这正是我想要的。只有标题、顺序和描述被设置为 attr_accessible,因此只有出现在神奇创建的 :widget 哈希中的属性。

我也在使用 active_model_serializers,所以 as_json 贯穿其中,以防有人认为它很重要。

这是我正在构建的公共(public)示例应用程序的一部分,因此如果有人认为它可能有用,将能够看到它的使用情况。

关于ruby-on-rails - 使用 rspec 在 Rails 3.2 中测试 JSON API,使用 Backbone 将发送的精确 PUT/POST 主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12497897/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com