【问题标题】:RSpec testing Devise SessionController with Jbuilder viewRSpec 使用 Jbuilder 视图测试设计 SessionController
【发布时间】:2015-12-22 09:30:18
【问题描述】:

我正在使用 RSpec 测试我在 Rails 应用程序中从 Devise 覆盖的 SessionsController:
class Users::SessionsController < Devise::SessionsController

sign_in 方法渲染一个 jbuilder 视图:
render '/users/sign_in', status: :ok

使用curl 测试视图时,我得到了预期的结果。但是我无法按照我的规格进行这项工作。我收到以下错误:

 Failure/Error: post '/users/sign_in', @data, format: 'json'
 ActionView::MissingTemplate:
   Missing template users/sign_in with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :haml]}. Searched in:

使用render_views,jbuilder 视图适用于其他规范。但是当我在这个规范中添加render_views 时,我得到:

`method_missing': undefined local variable or method `render_views' for RSpec::ExampleGroups::UserEdit:Class (NameError)

render_views 工作的规范与此规范之间的区别是类型。它在这里工作: describe SomeController, type: :controller do

但不是这个:
describe 'User edit', type: :request do

这是一个请求类型,因为我正在测试 API 响应。正如我所说,我从命令行使用 curl 获得了预期的 JSON 视图,但它在测试中不起作用。我一定是遗漏了一些小细节或做错了什么。

我也尝试将它添加到 Rspec.configure 但它没有改变任何东西:
config.render_views

编辑:

在控制器的响应中使用:render json: { stuff }.to_json, status: :ok 时必须添加测试通过。当我将其重构为 jbuilder 视图时,这开始失败。

关于格式,我正在使用“simple_token_authentication”gem 并将此信息传递给规范中的每个请求:

{
  'X-User-Email' => user.email,
  'X-User-Token' => user.authentication_token,
  'Content-Type' => 'application/json',
  'Accept'       => 'application/json'
}

我在其他测试中有format: :json,但没有成功:

  post '/users/sign_in', @data, format: :json

所以将 format: :json 设置为第二个参数中的值就可以了。

【问题讨论】:

标签: ruby-on-rails ruby json rspec devise


【解决方案1】:

您不需要为 request 规格设置 render_views。事实上,您现在遇到的错误表明视图实际上正在呈现,只是您的请求类型没有正确的类型 (html)。

您需要在请求的第二个参数中添加format: :json,如下所示:

@data[:format] = :json

post '/users/sign_in', @data

【讨论】:

    猜你喜欢
    • 2013-01-03
    • 2015-11-28
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多