Как заглушить метод экземпляра для конкретного экземпляра?

У меня ниже случай,

class Schools::Status
  def initialize(school)
    @school = school
  end

  def active?
    true
  end
end

Теперь я хочу заглушить метод active? для конкретной школы.

Один из способов получить подобное

Schools::Status.new(school).stubs(:active?).returns(false)

Но мой вариант использования отличается, у меня есть результаты поиска школ, и я хочу отфильтровать этот результат на основе значения active?, как показано ниже:

schools.select { |s| Schools::Status.new(school).active? }

В приведенном выше случае, в частности, я хочу заглушить active? для определенного экземпляра.


person Sandip Ransing    schedule 19.08.2014    source источник
comment
AFAIK stub работает только для объекта double, который вы создаете для насмешек в rspec. Или может я неправильно понял ваш вопрос? Что именно вы ищете?   -  person Surya    schedule 19.08.2014
comment
У меня есть коллекция школ, которая будет выбрана для школ на основе активности? условие. поэтому для конкретной школы я хотел заглушить метод active? класса Schools::Status.   -  person Sandip Ransing    schedule 19.08.2014
comment
И вам нужно это поведение в ваших спецификациях?   -  person Surya    schedule 19.08.2014


Ответы (2)


Просто исправьте свой класс в спецификации. Более rspec-способом было бы использовать any_instance с stub, но проблема в том, что вы не можете получить доступ к self заглушенного экземпляра, поэтому у вас практически нет информации о school, и вы не можете получить доступ это в том блоке. Пример:

Status.any_instance.stub(:active?) { # no way to access school }
person hahcho    schedule 19.08.2014
comment
на самом деле нет необходимости сопоставлять any_instance для self. Пожалуйста, смотрите ответ, где конкретный экземпляр может быть заглушен. - person Sandip Ransing; 19.08.2014

Я нашел ответ на себя и разместил здесь, чтобы другие могли получить пользу

Допустим, у меня есть school, для которого нужно заглушить active? метод Schools::Status.

Чтобы добиться этого, сначала нам нужно заглушить метод new для Schools::Status, чтобы он возвращал экземпляр Schools::Status, который мы хотим, и это можно сделать, как показано ниже:

status = Schools::Status.new(school)
# now whenever Schools::Status instance getting created for ours school 
# it will return our defined status instance
Schools::Status.stubs(:new).with(school).returns(status)

Во-вторых, мы должны заглушить метод active? для экземпляра состояния -

status.stubs(:active?).returns(false)

Теперь фильтр будет отклонять указанную школу, для которой метод active? возвращает false

person Sandip Ransing    schedule 19.08.2014