Я представляю два подхода: быстрый и грязный, и СУХОЙ и чистый:)
Быстрый и грязный:
context "when testing dependent: destroy" do
before do
@user = User.create
@servers = [Server.create]
@user.servers = @servers
end
it "should destroy all of the associated servers" do
@servers.each{|s| Server.exists?(s.id).should be_false}
end
end
Чтобы сделать это СУХИМ и многоразовым способом,только с зависимостью от самого rspec, вам нужен пользовательский сопоставитель для HasMany.Спецификация высокого уровня будет выглядеть следующим образом:
Subject { User.new }
it { should have_many :tasks, dependent: :destroy }
Тогда сопоставитель будет выглядеть следующим образом:
RSpec::Matchers.define :have_many do |_association, opts|
if opts and opts[:dependent]
match do |model|
associations(model, :has_many, opts).any? { |a| a == _association }
end
failure_message_for_should do |model|
error(
:expected => [ "%s to have many %s and to have dependent => :destroy %s", model, _association, opts[:dependent] ],
:actual => [ "%s has many %s ", model, associations(model, :has_many) ]
)
end
else
match do |model|
associations(model, :has_many).any? { |a| a == _association }
end
failure_message_for_should do |model|
error(
:expected => [ "%s to have many %s", model, _association ],
:actual => [ "%s has many %s", model, associations(model, :has_many) ]
)
end
end
end
Вам понадобится этот вспомогательный модуль rspec: http://pastie.org/6356719
Мне нравится первый подход, хотя он и грязный, потому что он идет в базу данных и использует полный стек рельсов ... но кто-то считает, что это слишком связано.Второй подход более сухой, но требует помощника, который просто анализирует саму ассоциацию и может не охватывать другие проблемы, которые могут испортить удаление связанных объектов ...