在rspec中设计重定向而不是json响应

时间:2016-09-10 19:02:49

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

我在设计中覆盖了默认响应,它渲染了json而不是html模板。当我用curl或postman测试它时它工作正常,但是当它用rspec测试时。我已经阅读了如何使用readme.md设计测试控制器的信息,以便在登录时工作正常,但是当我想测试未经身份验证的请求时它不起作用。

收到回复:

<html><body>You are being <a href=\"http://test.host/users/sign_in\">redirected</a>.</body></html>

而不是:

{"error":"You need to sign in or sign up before continuing."}

应用程序/控制器/ playlists_controller.rb:

class PlaylistsController < ApplicationController
  before_action :authenticate_user!

  def index
    render json: Playlist.all
  end
end

应用程序/控制器/ sessions_controller.rb:

class SessionsController < Devise::SessionsController
  clear_respond_to
  respond_to :json
end

规格/控制器/ playlists_controller_spec.rb:

require 'rails_helper'

describe PlaylistsController do
  context 'when user is not signed in' do
    it 'returns authorization error message' do
      get :index
      expect(response.body).to eq 'some message here'
    end
  end
end

规格/支持/ devise.rb

RSpec.configure do |config|
  config.include Devise::TestHelpers, type: :controller
end

3 个答案:

答案 0 :(得分:1)

在Rails 5中,我可以将控制器操作作为JSON处理的唯一方法是:

if (!intervals[idVar]) {
    intervals[idVar] = setInterval(function() {
        update();                            
    }, 1000);
}

希望这有帮助!

答案 1 :(得分:0)

您可以定义FailureApp或使用条件过滤器,这两者都在类似问题的答案中建议:https://stackoverflow.com/a/10042104/580346

答案 2 :(得分:0)

它在您的控制器测试中不起作用并且在curl中工作的原因是因为您没有使用:index格式:json(您已将逻辑写入{{} 1}})。

更改此

respond_to :json

到这个

it 'returns authorization error message' do
  get :index
  ...
end