2014-02-27 11 views
1

Я использую камень public_activity для создания фидов активности в своем приложении, а в моей модели я использую current_user для определения владельца.Тестирование модели Rspec - current_user в модели

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

Я понимаю, что ссылки CURRENT_USER в модели не является нормой, но это, как они recommend doing it.

Это прекрасно работает в приложении, но я бег в проблемы с моими тестами 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. Ryan Bates имеет хороший пример в его Railscast on Public Activity (см «Без учета действия»):

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

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

@question.create_activity :create, owner: current_user 
+0

Я пытался избежать создания create_activity в каждом методе, но вы правы - это путь. Спасибо за помощь. – dmanaster

0

Вы должны добавить хелперы RSpec в spec/support/devise.rb:

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

Вы найдете более подробную информацию here

+0

Спасибо за ответ! У меня это в spec/support/devise.rb, а current_user отлично работает в контроллерах. Это всего лишь модельные тесты, где я получаю эту ошибку. – dmanaster

+0

Мой плохой. Хотя похоже, что проблема заключается в том, что 'controller' равен нулю, а не отсутствию' current_user' – andreamazz