В моем упрощенном примере того, что я на самом деле делаю, скажем, у меня есть 2 вызова в базу данных:
Repo.add( something_stringy )
Repo.remove( something_floaty )
и я хочу использовать макеты для вызовов базы данных, поскольку реальные вызовы будут проверены в другом месте:
let(:repo){
repo = double("Repo")
repo.should_receive(:add).with(instance_of(String))
repo.should_receive(:remove).with(instance_of(Float))
repo
}
before { FakeKlass.const_set :Repo, repo }
все нормально, но теперь, если я заверну вызовы в транзакции, я немного озадачен:
Repo.transaction do
# ... some error checking in here somewhere...
Repo.add( something_stringy )
Repo.remove( something_floaty )
end
потому что, если я напишу макет, который получает transaction
, он получит вызов, но все в блоке не будет вызвано, и я получу:
ожидается: 1 раз
получил: 0 раз
для всех остальных издевательств. Кто-нибудь сможет показать мне, как я должен написать свою спецификацию, чтобы справиться с этим? Я попытался прочитать соответствующую страницу в книге RSpec по around(:each)
, но это было для меня почти так же ясно, как и грязь.
Любая помощь очень ценится.