2014-06-16 2 views
0

invoice.rb:В спецификации, как я могу назначить объект атрибуту, определенному attr_accessor?

class Invoice < ActiveRecord::Base 
    attr_accessible :user_obj 
    attr_accessor :user_obj 

    after_create :create_activity 
    def create_activity 
    log = "<b> Invoice created. </b>" + '<br/>' + '<span class="meta"> ' + self.user_obj.name + ' on ' + Time.now.to_date.strftime('%d-%m') + "</span>" 
    @activity = ActivityLog.new(:invoice_id => self.id,:user_id => self.user_obj.id, :log => log) 
    @activity.save 
    end 

end 

invoice_spec.rb:

it "some case for create invoice" do 
    @obj = create(:invoice)  # invoice data defined in factory file. 
end 

Ошибка после запуска спецификации:

undefined method `name' for nil:NilClass 
# ./app/models/invoice.rb:869:in `create_activity' 
# ./spec/models/invoice_spec.rb:246:in `block (3 levels) in <top (required)>' 

Выше моя модель invoice.rb, которая содержит один attribute_accessor "user_obj" и содержит информацию о пользователе, я использовал его в методе «create_activity» как «self.user_obj.name» или «self.user_obj.id».

Моя проблема заключается в том, что когда я запускаю свой spec для создания счета-фактуры, он выдает ошибку для «user_obj», которая не определена. Так может ли кто-нибудь помочь мне разрешить это?

+0

Я не вижу никакого кода, который устанавливает '# user_obj'. Если он находится на вашем заводе, добавьте его в вопрос. –

+0

при создании новых данных я установил его как params [: invoice] [: user_obj] = current_user в моем методе контроллера. Поэтому мой вопрос заключается в том, как выполнить эту настройку в тесте модели rspec, чтобы я мог получить пользовательские данные. –

ответ

0

factory_girl может присваивать объектам атрибуты, определяемые attr_accessor так же легко, как и атрибуты, определенные вашей схемой.

Просто написать :user_obj фабрику, и в вашей спецификации, использовать завод, чтобы создать UserObj и добавить его в Invoice:

it "some case for create invoice" do 
    @obj = create :invoice, user_obj: create(:user_obj) 
end 

Если вы хотите каждый Invoice иметь UserObj, дать Invoice завод ассоциация:

FactoryGirl.define do 
    factory :invoice do 
    user_obj 
    # invoice attributes ... 
    end 
end 

(Это самый простой синтаксис, который работает, когда ассоциация ActiveRecord и factory_girl фабрика имеют такое же имя Более подробно о доступном синте. ntax здесь: https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#associations)

Тогда вы можете просто сказать create :invoice, а Invoice будет иметь UserObj.

Сторона примечания: было бы здорово просто позвонить user_objuser или другое имя, которое говорит, почему это не просто пользователь. Все в Ruby - это объект ...

+0

Спасибо, Дейв, ваше предоставленное решение сработало для меня. –

Смежные вопросы