2013-11-21 3 views
0

У меня есть система тегов и поле для автоматического увеличения количества вопросов, относящихся к тегу. Я использую Mongoid.Тестирование after_hook с Rspec

Вопрос модель:

class Question 

has_and_belongs_to_many :tags, after_add: :increment_tag_count, after_remove: :decrement_tag_count 
after_destroy :dec_tags_count 
... 
private 
    def dec_tags_count 
    tags.each do |tag| 
     tag.dec_questions_count 
    end 
    end 

и Tag Модель:

class Tag 
    field :questions_count, type: Integer,default: 0 
    has_and_belongs_to_many :questions 

def inc_questions_count 
    inc(questions_count: 1) 
    end 

    def dec_questions_count 
    inc(questions_count: -1) 
    end 

Он отлично работает, когда я тестирую его в браузере вручную, он увеличивает и уменьшает tag.questions_count поле при добавлении или удалении теги, но мой тест для модели Question after_destroy всегда выпадает.

it 'decrement tag count after destroy' do 
     q = Question.create(title: 'Some question', body: "Some body", tag_list: 'sea') 
     tag = Tag.where(name: 'Sea').first 
     tag.questions_count.should == 1 
     q.destroy 
     tag.questions_count.should == 0 
    end 

expected: 0 
    got: 1 (using ==) 
    it { 
    #I`ve tried 
    expect{ q.destroy }.to change(tag, :questions_count).by(-1) 
    } 
    #questions_count should have been changed by -1, but was changed by 0 

нужна помощь ...

ответ

0

Это потому, что ваш tag еще ссылки на оригинал Tag.where(name: 'Sea').first. Я считаю, что вы можете использовать tag.reload после уничтожения вопрос (не могли бы попробовать это подтвердить) нравится следующим образом:

it 'decrement tag count after destroy' do 
    ... 
    q.destroy 
    tag.reload 
    tag.questions_count.should == 0 
end 

Но лучше, чем это, чтобы обновить tag, чтобы указать на q.tags.first, который, я считаю, что вы хочу:

it 'decrement tag count after destroy' do 
    q = Question.create(title: 'Some question', body: "Some body", tag_list: 'sea') 
    tag = q.tags.first # This is going to be 'sea' tag. 
    tag.questions_count.should == 1 
    q.destroy 
    tag.questions_count.should == 0 
end 
+0

Большое спасибо! Я начал немного нервничать, потому что не мог заставить его работать ... – FastIndian

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