Ожидайте вызова метода и прокси для исходного метода с помощью RSpec

Я хочу обнаружить, что в BDD отсутствуют параметры :include для метода ActiveRecord::Base.find. Итак, моя идея состоит в том, чтобы иметь в спецификации что-то вроде этого:

ActiveRecord::Base.should_receive(:find).once.and_proxy_to_original_method
parent = SomeClass.find 34
parent.child.should be_loaded
parent.other_children.should be_loaded

Если ассоциации #child или #other_children не загружаются с готовностью, ожидание должно завершиться ошибкой с чем-то вроде: «Ожидается, что ActiveRecord::Base.find будет вызван один раз, но он был вызван еще 2 раза со следующими аргументами: 1. ...; 2. ..."

Кто-нибудь знает, есть ли какой-нибудь сопоставитель, который работает так или как это сделать.

Спасибо


person BurmajaM    schedule 16.03.2011    source источник
comment
У меня такая же проблема. Очень хотелось бы, чтобы был один. Полезно для тестирования, если действительно? был вызван для зависимой модели или чего-то еще, чтобы убедиться, что иерархия проверена/сохранена.   -  person Dmitriy Likhten    schedule 21.07.2011
comment
возможный дубликат Есть ли менее навязчивая альтернатива Rspec ` должен_получить`?   -  person lulalala    schedule 17.03.2014


Ответы (1)


Я думаю, у меня была та же проблема здесь. В вашем конкретном случае я бы сделал это, что я считаю довольно чистым.

original_method = ActiveRecord::Base.method(:find)
ActiveRecord::Base.should_receive(:find).once do (*args)
  original_method.call(*args)
end

Я считаю, что вы могли бы расширить класс Rspec Mocks::MessageExpectation, включив в него метод and_proxy_to_original_method, это не должно быть слишком сложно, но я не смотрел.

person Joao Tavora    schedule 29.08.2011
comment
Хммм... идея мне нравится. Проверим и вернемся с результатом. Спасибо - person BurmajaM; 05.09.2011