2010-06-21 3 views
2

Я имею в project.rb:Rails: зависимый =>: уничтожить в тестировании

has_many :items, :dependent => :destroy 

И в item.rb:

belongs_to :project 

Мои проекты арматуре:

b1_s_first_project: 
    title: B1's first project 

И мои товары арматура:

В моем модульном тесте устанавливаются локальные переменные item = items(:b1_s_first_project_s_first_item) и project = projects(:b1_s_first_project). Когда я звоню project.destroy, project.destroyed? возвращает true, но item.destroyed? возвращает ноль, как будто он не был уничтожен. Что мне не хватает? Заранее спасибо.

ответ

5

Похоже, что вам может понадобиться добавить item.reload перед тестированием, если он будет уничтожен или не

+1

Очень хорошо. По существу правильно. 'item.reload' поднял исключение Object not found, поэтому я просто изменил это утверждение на' assert! Item.exists? (item) '. Забавно, однако, я думал, что цель ActiveRecord состояла в том, чтобы автоматически обновлять объекты, чтобы вам не приходилось постоянно искать их каждый раз. Кажется, что .destroyed? флаг будет одной из вещей, которые будут обновляться. –

+0

@steven: вещь как только объект загружен, он как-то кэширован, а затем есть трансляция, чтобы объект знал, что он удален. ^^ Рад, что я мог помочь – marcgg

0

Просто, чтобы обеспечить альтернативный метод, используя .reload на записи ассоциации, используя утверждение assert_raise. Это работает под Rails 5, но должно работать в двух предыдущих версиях.

Модель настройки:

# foo.rb 
class Foo < ApplicationRecord 
    has_many :bars, dependent: :destroy 
end 

# bar.rb 
class Bar < ApplicationRecord 
    belongs_to :foo 
end 

Крепеж настройки:

# foos.yml 
oof: 
    title: Hello 

# bars.yml 
rab: 
    title: World! 
    foo: oof 

Модель MiniTest:

test 'foo should destroy dependency bar on destroy' do 
    foo, bar = foos(:off), bars(:rab) 

    assert foo.destroy 
    assert_raise(ActiveRecord::RecordNotFound) { bar.reload } 
end