Draper Decorator规范无法使用Devise current_user方法

时间:2016-01-26 18:27:27

标签: ruby-on-rails rspec devise draper

我在PostDecorator中有app/decorators/post_decorator.rb个班级。 它有一个调用Devise的current_user方法的方法。它看起来像这样:

class PostDecorator < Draper::Decorator
  delegate_all

  def voter
    h.current_user
  end
end

我在PostDecorator

中有一个spec/decorators/post_decorator_spec.rb规范
require 'spec_helper'

describe PostDecorator, type: :decorator do
  let(:post) { FactoryGirl.create(:post) }
  let(:user) { FactoryGirl.create(:user) }
  before { allow(helper).to receive(:current_user) { user } }

  describe 'voter' do
    it 'returns the current_user' do
      expect(post.voter).to eq user
    end
  end
end

当我运行它时,我得到一个未定义的方法错误:

<Draper::HelperProxy:0x007fb1c4f85890 ... does not implement: current_user

宝石版本:

  • draper(1.4.0)
  • rspec-rails(3.4.1)
  • 设计(3.5.5)

另外我应该注意我的app/lib目录中的所有内容都是自动加载的。在application.rb我有config.autoload_paths << Rails.root.join('lib')

2 个答案:

答案 0 :(得分:1)

我认为你需要做的两件事。

1。)将装饰测试助手添加到装饰器测试中,

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

2。)你实际上需要sign_in以期望post.voter等同于实际用户

require 'spec_helper'

describe PostDecorator, type: :decorator do
  let(:post) { FactoryGirl.create(:post) }
  let(:user) { FactoryGirl.create(:user) }
  before do
    sign_in user
  end

  describe '.voter' do
    it 'returns the current_user' do
      expect(post.voter).to eq user
    end
  end
end

答案 1 :(得分:0)

该问题与Draper有关。 发送ActionMailer电子邮件后,Decorator无法访问辅助方法。

This is an open issue on Draper's GitHub

为了解决这个问题,我刚刚通过添加<li><a href=""></a></li>

修改了用户工厂
confirmed_at

这样,Devise不会发送确认电子邮件。