Я думаю, что нет простого способа установить ожидания для любого экземпляра подклассов. однако внедрение зависимостей в ваш метод облегчит вам его тестирование.
вы можете переписать его так, как показано ниже:
class App
def initialize(params_hash)
@children = params_hash[:children] || [ChildA.new, ChildB.new]
end
def apply
children.all? { |c| c.my_method }
end
private
attr_reader :children
end
, тогда в ваших тестах вы могли бы сделайте что-то похожее на следующее:
describe "#apply" do
it "returns true" do
children = [instance_double('SubClassA', my_method: true)]
expect(children.first).to receive(:my_method)
app = App.new(children: children)
expect(app.apply).to be true
end
end
использование expect_any_instance_of
может быть возможным признаком запаха кода, всякий раз, когда я начинаю думать об его использовании, я делаю паузу и смотрю на свой код и проверяю, могу ли я написать это лучше, так что легко тестировать, а внедрение зависимостей облегчает тестирование кода.
здесь вы пытаетесь подключиться к методу apply и проверить, что он делает, но это так. Наш клиентский код не может проверить, что происходит внутри него. поэтому я бы вводил свои зависимости и возлагал на них свои ожидания всякий раз, когда для меня это оправданно и разумно.