如何在rspec中使用current_user进行序列化程序测试

时间:2013-08-09 09:58:04

标签: ruby-on-rails-3 devise rspec2 serializer

我是rails和serializers的新手。我正在使用活动模型序列化程序gem进行序列化。

其中一个属性使用设计辅助方法'current_user'。它工作正常。但是当使用rspec运行规范时,我得到一个错误未定义的局部变量或方法'current_user'。请问有人可以帮我解决这个问题吗?

我正在使用rails 3.2和rspec 2

2 个答案:

答案 0 :(得分:2)

这个问题很老,但我遇到了同样的问题,尽管已经使用了Devise Helpers。

我使用Ruby on Rails 4.2,Rspec 3.5,Active Model Serializers 0.8.3。

我在Rspec中包含了Devise :: Test :: ControllerHelpers,可以在我的spec文件中使用sign_in,但在调用依赖NameError: undefined local variable or method 'current_user'的序列化方法时我有current_user 。请注意,控制器使用current_user罚款。

这是spec文件(不工作):

describe ArticleController do
  before :each do 
    @article = create(:article)
  end
  describe 'PUT #update' do
    context "as user" do
      before :each do 
        @u = create(:user)
        sign_in @u
      end

      it 'sets the seen status' do
        put :update, id: @article, article: { seen: true }
        expect(ArticleSerializer.new(@article.reload).seen).to eq(true)
      end
    end
  end
end

和Serializer:

class ArticleSerializer < ActiveModel::Serializer
  attributes :id, :text, :seen

  def seen
    object.article_user_seen.find_by( user_id: current_user.id ).try(:seen) || false
  end

end

我在创建序列化程序实例时使用选项scopescope_name修改了测试。感谢此指南:https://github.com/rails-api/active_model_serializers/blob/master/docs/general/serializers.md

下面的工作测试:

describe ArticleController do
  before :each do 
    @article = create(:article)
  end
  describe 'PUT #update' do
    context "as user" do
      before :each do 
        @u = create(:user)
        sign_in @u
      end

      it 'sets the seen status' do
        put :update, id: @article, article: { seen: true }
        expect(ArticleSerializer.new(@article.reload, scope: @u, scope_name: :current_user).seen).to eq(true)
      end
    end
  end
end

答案 1 :(得分:1)

首先你应该在你的rspec文件中包含include Devise::TestHelpers,然后你应该创建一个用户并登录它。喜欢这段代码:

@user = create(:user)

sign_in @user