Тестирование модели 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
Вы найдете больше информации здесь