【发布时间】: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 设置为第二个参数中的值就可以了。
【问题讨论】:
-
你能粘贴通过的测试和失败的测试吗?您可能遗漏的细节(只是猜测)是对 Rspec
subject的隐式使用。
标签: ruby-on-rails ruby json rspec devise