Есть ли в Minitest что-то похожее на allow_any_instance_of из RSpe c? - PullRequest
0 голосов
/ 17 июня 2020

From Docs

rspe c -mocks предоставляет два метода, allow_any_instance_of и expect_any_instance_of, которые позволят вам заглушить или имитировать любой экземпляр класс. Они используются вместо allow или expect:

allow_any_instance_of(Widget).to receive(:name).and_return("Wibble")

Есть ли что-то похожее на эту функцию для имитации метода для всех экземпляров класса с Minitest?

1 Ответ

0 голосов
/ 17 июня 2020

Согласно документации 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

...