【发布时间】:2012-09-11 22:48:03
【问题描述】:
我正在尝试为使用 Rails 3.2 编写的 JSON API 编写一组 rspec 测试,其中 Backbone 作为前端。我正在编写的测试专门针对 Rails 控制器。
现在,应用程序本身运行良好。当客户端发出带有正文的 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
事情根本没有解决。在控制器中,如果我检查 params 变量,我会得到:
{ "model_name" => {} }
如果我省略了“Content-type”标题行,我会得到@update_json,但没有Rails 操作来创建我在控制器中需要的“model_name”映射。
我成功运行测试的唯一方法是:
@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 请求;它只是模拟出来的。例如,您无法让系统以 404 响应,因为 Rails 抛出了一个异常,该异常通常会被 Rails 网络堆栈捕获并变成 404,但在 Rspec 中没有。所以问题看起来比上面的更深......
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 backbone.js