Rspec позволяет утверждать, что данные изменились в области действия конкретного блока.
it "should delete existing statistics" do
lambda do
@structure_updater.update_structure
end.should change(SeAccount, :count).by(3)
end
... или что-то подобное, в зависимости от того, как выглядит ваша схема, и т. Д. Не уверен, что именно происходит в delete_existing_statistics, поэтому соответствующим образом измените предложение change.
РЕДАКТИРОВАТЬ: сначала не понял вопрос, мои извинения. Вы можете попробовать следующее, чтобы убедиться, что эти вызовы происходят в заданном порядке (опять же, с использованием RSpec):
РЕДАКТИРОВАТЬ: Вы не можете утверждать ожидание против транзакции в тесте, который имеет ожидания для вызовов в пределах этой транзакции. Самым близким, что я мог придумать, было:
describe StructureUpdater do
before(:each) do
@structure_updater = StructureUpdater.new(Structure.new)
end
it "should update the model within a Transaction" do
SeAccount.should_receive(:transaction)
@structure_updater.update_structure
end
it "should do these other things" do
@structure_updater.should_receive(:delete_existing_statistics).ordered
@structure_updater.should_receive(:delete_existing_structure).ordered
@structure_updater.should_receive(:add_campaigns).ordered
@structure_updater.update_structure
end
end
ONE MORE TRY: Еще один незначительный взлом - заставить один из более поздних вызовов метода в блоке транзакции поднять и утверждать, что в БД ничего не изменилось. Например, если предположить, что Statistic является моделью, а delete_existing_statistics изменит счетчик Statistication в БД, вы можете знать, что вызов произошел в транзакции, если позднее в транзакции возникнет исключение, откатившее это изменение. Что-то вроде:
it "should happen in a transaction" do
@structure_updater.stub!(:add_campaigns).and_raise
lambda {@structure_updater.update_structure}.should_not change(Statistic, :count)
end