Тестирование модели Rspec - current_user в модели

Я использую гем public_activity для генерации каналов активности в своем приложении, а в моей модели я использую devise 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 в моей модели работать в моих тестах?

2 ответа

Решение

Лично я не думаю, что вы должны ссылаться на controller изнутри model, Потому что вы не хотите создавать экземпляр controller возражать каждый раз, когда вы хотите получить доступ к model,

Например, вы можете получить доступ к model от фонового работника: кто твой current_user а какой твой controller?

То же самое относится и к вашему набору тестов. Вы хотите проверить свои model, Не твое controller,

Также вы не всегда можете отслеживать активность.

Лучший подход - передать current_user объект из controller, У Райана Бейтса есть хороший пример в его Railscast по публичной деятельности (см. "Исключение действий"):

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

И для каждой деятельности вы хотите отслеживать

@question.create_activity :create, owner: current_user

Вам нужно добавить помощников RSpec в spec/support/devise.rb:

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

Вы найдете больше информации здесь

Другие вопросы по тегам