RSpec使用Jbuilder视图测试Devise SessionController

时间:2015-09-24 17:04:32

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

我使用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作为第二个参数中的值使得工作正常。

1 个答案:

答案 0 :(得分:1)

您不需要为render_views规范设置request。事实上,您现在所犯的错误表明视图实际上是在渲染,而且您的请求类型(html)没有正确的视图。

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

@data[:format] = :json

post '/users/sign_in', @data