使用 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 主体 的相关文章

  • 水豚找不到元标签

    Capybara 2 1 0 似乎没有找到任何元标记 rdb 1 p page find meta Capybara ElementNotFound Exception Unable to find css meta 即使他们出现在page
  • Rails 3.0.0.beta 和 Facebooker:还有其他人看到以下内容吗?

    我的 Rails 服务器在安装 facebooker 插件后似乎崩溃了 任何有关解决此问题的建议都会很棒 我正在使用 Rails 3 0 0 beta 和 facebooker 以下是我看到的步骤和错误 rails v Rails 3 0
  • Rails 验证日期范围的唯一性

    我有一个涉及员工缺勤记录的应用程序 我需要确保每条记录的开始日期和结束日期不重叠 例如 如果我输入了从今天开始到明天结束的缺勤记录 则不可能以任何方式在该日期范围内输入另一个缺勤记录 所以我不能制作一个从前天开始 然后在后天或任何更晚的日期
  • 如何检查rails上传的文件类型?

    我如何查看即将到来的文件类型 例如 csv 或 xls 请给个代码 我得到文件是这样的 aut name uploaded io original filename File open Rails root join public uplo
  • 如何使用Factory Girl生成回形针附件?

    我有一个包含许多图像的模型 Person 其中图像有一个称为数据的回形针附件字段 下面显示了缩写版本 class Person has many images end class Image has attached file data b
  • 如何使用 RSpec 检查 JSON 响应?

    我的控制器中有以下代码 format json render json gt flashcard gt flashcard lesson gt lesson success gt true 在我的 RSpec 控制器测试中 我想验证特定场景
  • 如何检查水豚中的复选框?

    我正在使用 Rspec 和水豚 我怎样才能写一个步骤来检查checkbox 我试过了check按价值但它找不到我的checkbox 我不知道该怎么做 因为我实际上有相同的 ID 但值不同 这是代码
  • 为什么 Rails 5 将“索引”更改为“外键”?

    如果你在 Rails 4 中有这个 t references event index true 现在你可以使用foreign key代替index在 Rails 5 中 我不太明白为什么他们决定这样做 因为功能保持不变 您添加的是索引 而不
  • ruby on Rails,会话过期通知

    我正在使用 ruby 1 9 3 和 Rails 3 2 我的实际会话处理如下所示 会话助手 def sign in user cookies remember token value user remember token expires
  • Rails:渲染不起作用,仍然出现“模板丢失”

    我目前正在学习 Rails 指南 我完成了这些步骤 但仍然遇到错误 我的 Ruby 版本是ruby 2 1 1p76Rails 版本是4 0 4 按照指南的指示 我创建了一个Article Controller class Articles
  • Eventmachine start_tcp_server 无接受器 - 端口正在使用或需要 root 权限(运行时错误)

    我已经 3 天无法运行本地服务器了 重新启动我的计算机没有帮助 有几次 在反复尝试大约 40 50 次之后 它随机地起作用了 我不明白为什么 我尝试过一次不同的端口并且有效 但从那以后 没有端口有效 每次我尝试运行我的 Rails 服务器时
  • Rails 3:使用 Simple_form 如何创建一个向specialities#create 发布帖子的表单?

    如何使用 Simple form 创建一个向specialities create 发布帖子的表单 我试过这个
  • 更改迁移中的自动​​增量值(PostgreSQL 和 SQLite3)

    我有一个托管在 Heroku 上的项目 想要更改表的自动增量起始值 我在本地使用 SQLite3 Heroku 使用 PostgreSQL 这是我在迁移中所拥有的 class CreateMytable lt ActiveRecord Mi
  • 如何在 sunspot solr 中进行简单的布尔查询

    gt gt gt marketing User search do s gt gt gt s fulltext Marketing gt gt gt end gt gt gt marketing total 1448 gt gt gt sa
  • 在 CircleCI 中设置 Elasticsearch 和 Ruby on Rails

    我正在尝试在 Rails 应用程序中使用 Elasticsearch 设置 CircleCI 我想已经配置了镜像 但是如何在 CI 中连接到它 到目前为止我已经尝试过 https github com elastic elasticsear
  • Rails 3 Mechanize - SocketError:getaddrinfo:主机或名称未知

    我正在使用 mechanize 但出现此错误 有人可以帮帮我吗 我已将元刷新设置为 true 错误日志 SocketError getaddrinfo Host or name not known form C Ruby192 lib ru
  • 自定义通用 Rails 错误消息

    我们的 Rails 应用程序被设计为链接到多个客户端数据库的单个代码库 根据子域 应用程序确定要连接到哪个数据库 我们使用液体模板为每个客户定制演示文稿 我们无法为每个客户定制通用的 我们很抱歉 出了点问题 消息 谁能推荐一种方法让我们能够
  • 回滚后是否应该删除迁移

    我对 ruby 和 Rails 相当陌生 刚刚开始了解迁移 我的问题是回滚后删除迁移的最佳实践或正确时间是什么 到目前为止 我读到的内容是回滚后是否删除迁移的观点问题 但是在团队中工作时删除迁移是否有任何重大影响 以及保留迁移文件相对于删除
  • 通过 ESI:include 设置 Cookie,如何?

    我正在尝试使用 esi 在我的网站上创建忍者缓存 这个想法是 该网站大部分是静态的 我只需要在用户是否登录时做一些花哨的事情 所以我试图在页面A上放置一个 并在页面B的应用程序中设置触发器 这样我就可以将页面 A 缓存在 varnish 上
  • 在 ActiveAdmin 或打印解决方案中动态更改分页

    我是 Activeadmin 和 Rails 的新手 我需要一些帮助 我有一个分页模型 我想允许用户更改分页值或完全禁用它 这样它就可以打印 到打印机 所有记录 或过滤后的记录 我知道我可以在 before filter 中使用 per p

随机推荐

  • 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 请求时