Согласно документации Minitest, вы можете имитировать только отдельные экземпляры.
https://github.com/seattlerb/minitest#mocks -
Не видя всего кода, трудно судить, но может быть так ваша архитектура может быть улучшена. Например, вы можете использовать внедрение зависимостей, чтобы избежать allow_any_instance_of
, а также сделать свой класс более расширяемым.
Вместо того, чтобы делать
class Foo
def initialize
@widget = Widget.new
end
def name
widget.name
end
end
и делать в своем тесте
it "does expect name" do
allow_any_instance_of(Widget).to receive(:name).and_return("Wibble")
Foo.new.name
end
Вы можете внедрить класс виджета следующим образом
class Foo
def initialize(widget_class = Widget)
@widget = widget_class.new
end
def name
widget.name
end
end
и в свой SPE c
it "does expect name" do
widget = double()
widget.stub(:name) { 'a name' }
foo = Foo.new(widget)
expect(foo.name).to eq('a name')
end
Код теперь следует принципу «открыт-закрыт» и является более расширяемым. Но трудно судить, не видя вашего кода, является ли это жизнеспособным для вас решением.
Обобщено в статье в блоге здесь https://sourcediving.com/testing-external-dependencies-using-dependency-injection-ad06496d8cb6