我正在尝试为以 Backbone 作为前端的 Rails 3.2 编写的 JSON API 编写一组 rspec 测试。我正在编写的测试专门针对 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 中没有。所以问题看起来比上面的更深......