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

Draper Decorator spec not able to use Devise current_user method

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

class PostDecorator < Draper::Decorator
  delegate_all

  def voter
    h.current_user
  end
end

我在 spec/decorators/post_decorator_spec.rb

中有一个 PostDecorator 规范
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

Gem 版本:

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

我认为你需要做两件事。

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

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

This is an open issue on Draper's GitHub

为了解决这个问题,我刚刚通过添加 confirmed_at:

修改了用户工厂
factory :user do
  ...
  confirmed_at DateTime.now
end

这样 Devise 就不会发送确认邮件了。