Как проверить вызов метода в конструкторе с помощью rspec - PullRequest
1 голос
/ 11 марта 2011

У меня есть такой конструктор:

class Foo
  def initialize(options)
    @options = options
    initialize_some_other_stuff
  end
end

и я хочу проверить вызов initialize_some_other_stuff, если создаю новый объект Foo.

Я нашел этот вопрос rspec: Как заглушить метод экземпляра, вызываемый конструктором? , но предлагаемое решение для вызова Foo.any_instance(:initialize_some_other_stuff) не работает в моей версии rspec (2.5.0).

Может кто-нибудь помочь мне проверить этовызов конструктора?

Ответы [ 3 ]

0 голосов
/ 28 августа 2011

Вот, пожалуйста:

stub_model (Foo) .should_receive (: some_method_call) .с (optional_argument)

0 голосов
/ 14 декабря 2018

Так как метод initialize_some_other_stuff является закрытым для класса, вам не важно, выполняется он или нет. Тем не менее, если этот метод выполняет дорогостоящую операцию, которую вы не хотите, чтобы ваш тест ждал, то вполне нормально смоделировать эту операцию.

Итак, если Фу выглядел так:

class Foo
  attr_reader :options, :other_stuff

  def initialize(options)
    @options = options
    initialize_some_other_stuff
  end

  def initialize_some_other_stuff
    @other_stuff = Bar.new.long_running_operation
  end
end

Тогда вы могли бы издеваться над звонком на Bar#long_running_operation так:

describe Foo do
  subject(:foo) { described_class.new(options) }

  let(:options) { 'options' }
  let(:bar) { instance_double(Bar, long_running_operation: 42) }

  before do
    allow(Bar).to receive(:new).and_return(bar)

    foo
  end

  it 'initializes options' do
    expect(foo.options).to eq(options)
  end

  it 'initializes other stuff' do
    expect(foo.other_stuff).to eq(bar.long_running_operation)
  end
end

Теперь вы проверяете задания. Но вы не ожидаете завершения дорогостоящей операции.

0 голосов
/ 11 марта 2011

В вашей спецификации у вас может быть следующее:

class Foo
  attr_reader :initializer_called
  def initialize_some_other_stuff
    @initializer_called = true
  end
end

foo = Foo.new
foo.initializer_called.should == true

Если конструктор вызывает метод initiaize_some_other_stuff, foo.initializer_called должно быть истинным.

...