0

我有一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

宝石版本:

  • 布帘 (1.4.0)
  • rspec-rails (3.4.1)
  • 设计(3.5.5)

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

4

2 回答 2

1

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

1.) 将设计测试助手添加到您的装饰器测试中,

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

2.)您实际上需要登录才能期望post.votereq 实际用户

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
于 2016-01-26T20:01:06.583 回答
0

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

这是 Draper 的 GitHub 上的一个未解决问题

为了解决这个问题,我刚刚修改了用户工厂,添加了一个confirmed_at

factory :user do
  ...
  confirmed_at DateTime.now
end

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

于 2016-01-26T20:08:04.570 回答