我正在尝试为以 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 主体。
有任何想法吗?
更新:
从环顾四周来看looks就像你实际上无法从 rspec 发出真正的 HTTP 请求一样;它只是被嘲笑的。例如,您无法让系统响应 404,因为 Rails 会抛出异常,该异常通常会被 Rails 网络堆栈捕获并转换为 404,但 Rspec 中不会出现该异常。所以问题看起来比上面的更深刻......