2

我正在使用 public_activity gem 在我的应用程序中生成活动提要,在我的模型中,我正在使用设计的 current_user 来识别活动的所有者。

class Question < ActiveRecord::Base
  ...
  include PublicActivity::Model
  tracked owner: ->(controller, model) { controller.current_user }
  ...
end

我意识到在模型中引用 current_user 不是常态,但这是他们推荐的方式

这在应用程序中运行良好,但我的 Rspec 测试遇到了问题,我收到以下错误:

Failure/Error: expect(create(:question)).to be_valid
NoMethodError:
undefined method `current_user' for nil:NilClass
# ./app/models/question.rb:8:in `block in <class:Question>'
# ./spec/models/question_spec.rb:7:in `block (3 levels) in <top (required)>'

测试本身很典型:

describe "Factory" do
  it "has a valid factory" do
    expect(create(:question)).to be_valid
  end
end

这是我的工厂:

FactoryGirl.define do
  factory :question do
    title { Faker::Lorem.characters(30) }
    body { Faker::Lorem.characters(150) }
    user_id { 1 }
    tag_list { "test, respec" }
  end
end

如何让我的模型中的这个 current_user 方法在我的测试中工作?

4

2 回答 2

4

就个人而言,我认为您不应该controllermodel. 因为您不想在controller每次想要访问model.

例如,您可能想model从后台工作人员访问:谁是你的current_user,你的是谁controller

这同样适用于您的测试套件。你想测试你的model,而不是你的controller

此外,您可能并不总是想跟踪活动。

更好的方法是current_usercontroller. Ryan Bates 在他的Railscast on Public Activity中有一个很好的例子(参见“排除操作”):

class Question < ActiveRecord::Base
  include PublicActivity::Common
end

对于您要跟踪的每项活动

@question.create_activity :create, owner: current_user
于 2014-02-27T20:35:04.310 回答
0

您需要在以下位置添加 RSpec 助手spec/support/devise.rb

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

你可以在这里找到更多信息

于 2014-02-27T18:22:05.543 回答