我使用RSpec测试SessionsController我在我的Rails应用程序中覆盖了Devise:
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视图时,这开始失败。
关于格式,我使用了&#39; simple_token_authentication&#39; 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
所以设置格式:: json作为第二个参数中的值使得工作正常。
答案 0 :(得分:1)
您不需要为render_views
规范设置request
。事实上,您现在所犯的错误表明视图实际上是在渲染,而且您的请求类型(html
)没有正确的视图。
您需要在请求中的第二个参数中添加format: :json
,如下所示:
@data[:format] = :json
post '/users/sign_in', @data