使用 rspec 测试 Rails 3.2 中的 JSON API,使用 Backbone 发送的精确 PUT/POST 主体

2024-03-18

我正在尝试为以 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 中不会出现该异常。所以问题看起来比上面的更深刻......


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

最终我追踪到了ActionController::ParamsWrapper,_wrapper_enabled在哪里?总是返回 false (由于 request.content_mime_type 为零)。这个解决方案对我有用。我一直在寻找“神奇”的参数键来添加,这就是它的作用。

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 正在运行,以防有人认为这很重要。

这是我正在构建的公共示例应用程序的一部分,因此如果有人认为该代码可能有用,则可以在使用中看到该代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 rspec 测试 Rails 3.2 中的 JSON API,使用 Backbone 发送的精确 PUT/POST 主体 的相关文章

  • 使用“ember-rails”将路由从 Rails 迁移到现有 Rails 应用程序的 Ember

    将 gem ember rails 用于现有的 Rails 应用程序 我正在尝试使用 Ember 路由一个资源 很多人告诉我这段代码应该可以工作 但事实并非如此 我想突破学习曲线并使这项工作成功 但我需要一些帮助 Error Routing
  • 带 Rails 6/Webpack 的 Gmap

    我正在尝试让以前与早期版本的 Rails 一起使用的 Google 地图设置使用 Rails 6 显示 显然 Rails 6 现在使用 webpack 来处理 javascript 资源 并且我无法让我的应用程序识别用于识别的 Gmaps
  • Rails 中 WHERE 子句中的 ALL 运算符

    关联关系如下图所示 InstructorStudent has many fees Fee belongs to instructor student 我想要获得在所有给定数组中具有每月详细信息的指导学生 如果其中任何一个中不存在每月详细信
  • 如何使用 Cucumber 和 Rspec 测试 Rails 3 引擎?

    如果这个问题有点主观 我深表歉意 我正在尝试找出使用 Cucumber 和 Rspec 测试 Rails 3 引擎的最佳方法 为了测试引擎 需要 Rails 3 应用程序 这是我目前正在做的事情 通过运行以下命令将 Rails 测试应用程序
  • 搜索逻辑和虚拟属性

    假设我有以下模型 Person
  • Rails error_messages 帮助器

    这是一段很常见的代码 First name br error messages是一个辅助方法 但我很难找到它的文档 为什么呢 我在这里找到它们 error messages 具有相同的参数错误消息 http apidock com rail
  • 使用 Paperclip 保存文件而不上传

    我有一个简短的问题 是否可以保存文件而不实际通过表单上传 例如 假设我正在查看电子邮件中的附件 并且我想使用回形针保存它们 我该怎么做呢 我是否必须在某处手动调用 save file 或类似的东西 任何帮助将非常感激 我有一个 rake 任
  • 如果你使用belongs_to而没有相应的has_one,会发生什么?

    我有一个核心模型Item 以及一个从自定义源 例如 RSS feed 填充它的脚本 在 feed 中 每个项目都用一个标识guid 在我的系统中 项目只有一个自动生成的id首要的关键 我想要 比方说 ItemFeedInfo那个地图guid
  • 如何将枚举作为字符串存储到rails中的数据库中

    如何在 ruby 中创建迁移 其中默认值是字符串而不是整数 我想将枚举存储到数据库中 但我不想将其存储为整数 因为这样对于另一个应用程序来说没有意义想要使用同一张桌子 我该怎么做default female 代替default 0 clas
  • 以 Rails 形式处理 MongoMapper EmbeddedDocument

    首先 我对一般编程和 Rails 都是新手 我选择 Rails 是因为它看起来是一种很容易上手的语言 对于我的项目 我将 MongoMapper 与 Rails 结合使用 我正在尝试以与文档相同的形式处理嵌入文档 我有以下模型 class
  • Rails 生产“CSS 未预编译”

    我已经在我的 Leopard 网络服务器上使用生产环境在姊妹 Rails 3 1 应用程序上完成了此操作 所以我没想到部署这个应用程序会如此失败 我已经让 Passenger 识别出该应用程序 但我在 apache 中收到 GET miss
  • 没有 Gem 的 Rails 分页

    我的任务是在不使用 gem 的情况下为 Rails 项目创建 前 10 个 后 10 个 最新 和 最旧 链接 在控制器中 我可以显示表中第一组 最新的 10 项 before action set page only index def
  • Rails 中的“class << self”是什么意思? [复制]

    这个问题在这里已经有答案了 可能的重复 Ruby 中的 class https stackoverflow com questions 2505067 class self idiom in ruby有人可以向我解释一下 class htt
  • 可以通过 url 发送 JSON 吗?

    我有一个 ruby 哈希 其中键是 url 值是整数 我将哈希值转换为 JSON 我想知道是否能够通过 AJAX 请求在 url 内发送 JSON 然后从 params 哈希值中提取该 JSON 另外 我将把 JSON 化的 ruby 哈希
  • Rails“where”方法通过子属性查找父级

    我有一个 Rails 应用程序 我试图根据子类的日期创建父类的列表 现在我有 orders Order where order reminders date lt 1 month from now 但我收到一个错误 没有这样的列 order
  • 捆绑安装到开发

    由于某种原因 当我跑步时bundle install它安装到生产中 Your bundle is complete It was installed into RAILS ENV production Arrrghh 我如何切换回开发 No
  • factory_girl + rspec 似乎并没有在每个示例后回滚更改

    类似于这里描述的问题 http rpheath com posts 411 how to use factory girl with rspec http rpheath com posts 411 how to use factory g
  • Production.log 中没有日志消息

    我编写了一个演示 HelloWorld Rails 应用程序并使用 WEBrick 对其进行了测试 它甚至不使用数据库 它只是一个打印 hello world 的控制器 然后我尝试将其部署到由 Passenger 驱动的本地 Apache
  • Rails 4 中如何使用 attr_accessible?

    attr accessible似乎不再在我的模型中工作 Rails 4 中允许批量分配的方法是什么 Rails 4 现在使用参数强 http edgeapi rubyonrails org classes ActionController
  • 查找日期时间与今天日期匹配的记录 - Ruby on Rails

    我有一个交易表 需要查找日期与今天的日期匹配的记录 从 Rails 控制台 我需要匹配的日期字段如下所示 我已经分配了一条记录来进行测试 ruby 1 9 2 p0 gt deal start gt Tue 10 May 2011 00 0

随机推荐

  • Nodejs crypto.publicEncrypt 在不同的机器上产生不同的结果

    我们正在尝试使用 AWS KMS 中的非对称密钥进行加密和解密 key的配置如下 在 NodeJS 中 我们通过 crypto publicEncrypt 使用公钥进行加密 const encryptRSAPayload buffer pu
  • 什么是mockito-inline以及它如何模拟最终方法?

    Mockito 中的 Javadocs 说 从版本 2 7 6 开始 我们提供了 mockito inline 工件 无需配置 MockMaker 扩展文件即可实现内联模拟制作 这是什么意思 mockito inline 是如何工作的 为什
  • 如何使用 JavaScript 读取文本区域中的文本?

    所以我是 JS 的新手 正在尝试了解基础知识 我决定制作一个基本的网页文本编辑器 现在我正在尝试用 JS 来区分单词 这是我的代码 基本上它确定单词 bob 是否已输入到文本区域中
  • 使用 php 验证链接

    谁能告诉我是否可以用 php 验证链接 通过验证 我的意思是检查链接是否处于活动状态 并且不仅仅是链接的实际格式 您需要执行 HEAD 请求并检查响应 200表示请求成功 还有其他的可以在这里找到 http www w3 org Proto
  • MacPorts 手动端口位置

    我正在从 MacPorts 安装一个 python 库 但macports版本的库比实际开发的svn版本旧 是否可以在 MacPorts 中指定端口安装的自定义位置 以便我可以从开发人员站点安装最新的库 Have http guide ma
  • MySQL 复合索引和运算符 BETWEEN

    我对这个查询有一个疑问 SELECT FROM runs WHERE NOW BETWEEN began at AND finished at 您认为为 begin at 和 finish at 列创建复合索引有意义吗 或者只为 begin
  • 模糊效果在模拟器中显示,但在 iPhone 上不显示

    我想创建一个模糊效果UIImageView与下面的代码 问题是 当我在模拟器中运行它时 我可以看到 BlurEffect 但当我连接 iPhone 时却看不到 这里我只能看到灰色背景 有什么想法吗 这是我使用的代码 import UIKit
  • 如何在 MASM 中编写远绝对 JMP/CALL 指令?

    如何使用 MASM 编写远绝对 JMP 或 CALL 指令 具体来说 如何让它使用 EA 和 CA 操作码发出这些指令 而不使用 DB 或其他数据指令手动发出它们 例如 考虑跳转到引导扇区中 FFFF 0000 处的 BIOS 重置入口点的
  • 使用 python 从 BytesIO 创建 Excel 文件

    我在用pandas用于存储 Excel 的库bytesIO记忆 稍后我会存储这个bytesIO对象导入 SQL Server 如下 df pandas DataFrame data1 columns col1 col2 col3 outpu
  • 非常慢的 HHVM、Wordpress、Nginx

    我可能做错了什么 但我正在 php fpm wordpress 设置和 HHVM wordpress 设置之间进行一些测试 我听过并看到过 HHVM 的许多令人兴奋的结果 但我只是对我得到的结果感到震惊 使用以下 apache 测试命令 我
  • 来自 Android 版 IndexedDB Chrome 中保存的块的 HTML5 视频

    我想使用 IndexedDB 在客户端存储离线 HTML5 应用程序的视频文件 为此 我从服务器 API 中下载了 2 个块的视频 然后我将它们作为 blob 存储在 indexedDB 中 然后在其他页面上我从数据库获取它们并创建新的 b
  • 迭代调用 pandas datareader

    我有一个带有股票列表的 python 字典 我试图在 for 循环中使用键 股票代码 见下文 来迭代地为所有股票 以股票代码命名 创建多个 pandas DataFrame 并通过 pandas DataReader 填充价格 交易量 我认
  • JavaFX和Mac:如何设置窗口关闭按钮修改状态?

    我希望能够设置应用程序的修改状态并将其反映在窗口关闭按钮 即其中的黑点 中 我发现了一个非常好的概述 参见 http nadeausoftware com node 90 http nadeausoftware com node 90 如何
  • 简单 mips 中的无限循环

    我正在尝试了解 ra 所以我想要的输出是 mainfunction1main 通过 main 调用 function1 function1 返回到 main 然后 main 完成 但由于某种原因 我得到一个无限循环 打印 mainfunct
  • 使用参数变量获取传递给 ES6 箭头函数的参数 [重复]

    这个问题在这里已经有答案了 我了解箭头函数在 ES6 中的工作原理以及词法 this 但我想知道是否有人知道如何将参数传递给箭头函数 在 ES5 中 你可以简单地执行以下操作 function foo bar baz console log
  • 使用 Opam 管理项目依赖关系

    我是 OCaml 的新手 我使用过的其他语言 例如 Scala Clojure Node js 上的 Javascript 都有包管理器 允许人们以干净的状态启动项目 该项目具有一组已声明的已知版本的依赖项 我正在尝试与 Opam 做类似的
  • 将 ANTLR 语法翻译为 XText 语法:如何删除句法谓词

    我对 Xtext 和 ANTLR 都很陌生 我需要将 ANTLR g 语法转换为 XTEXT xtext 语法 在 ANTLR 语法中 存在 Xtext 不支持的语法谓词 有没有办法删除 翻译这些谓词 Thanks EDIT 我尝试翻译的
  • Java 中继承的坏例子是什么?

    我知道Java中继承的优点 但我有点难以接受它也有缺点 有人能给我一个 Java 继承的坏例子吗 Stack extends Vector 堆栈不是向量 Properties extends Hashtable 属性表不是哈希表 See 这
  • 延迟第 3 方 JavaScript 的加载

    是否有任何方法可以延迟加载第 3 方 JavaScript 文件 直到页面的其余部分完成加载 您可以附加到页面的 onload 事件 一旦触发 您就可以动态插入对文件的引用 例如 function loaded var el documen
  • 使用 rspec 测试 Rails 3.2 中的 JSON API,使用 Backbone 发送的精确 PUT/POST 主体

    我正在尝试为以 Backbone 作为前端的 Rails 3 2 中编写的 JSON API 编写一组 rspec 测试 我正在编写的测试是专门针对 Rails 控制器的 现在 应用程序本身运行良好 当客户端发出带有正文的 PUT 请求时