Как заглушить \ mock экземпляр в заявлении case? - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть один метод класса, который использует другой метод экземпляра класса:

class Foo
  def foo
    # a lot of code here, which return String instance
  end
end

class Bar
  class UnknownType < StandardError;end 

  def initialize(foo)
    self.foo = foo
  end 

  attr_reader :foo 

  def call
    # some code which use method foo
    foo
  end

  private

  def foo=(attr)
    @foo ||= case attr
               when Foo then attr.foo
               when String then attr
               else raise UnknownType, "Unknown type #{attr.class.name}"
             end
  end

end

И мой тест не работает, я пытаюсь использовать методы: - is_a - kind_of?

let(:foo) { instance_double(Foo, foo: 'some text') }
let(:bar) { Bar.new(foo) }

subject { bar.call }

it 'make some business logic here' do
  expect { subject }.to be_truthy
end

Но возникает ошибка UnknownType, потому что шаблон #<InstanceDouble(Foo) (anonymous)>

не Foo

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Операторы case используют === для целей равенства регистра, и в этом случае Foo является получателем, а не аргументом.например,

  case attr
    when Foo then attr.foo
  end 

Сравнивает attr с Foo как Foo === attr, а не наоборот.

Таким образом, вы можете изменить свой тест на

it 'make some business logic here' do
  allow(Foo).to receive(:===).with(foo).and_return(true)
  expect { subject }.to be_truthy
end

Таким образом, при оценке вашего оператора case он будет следовать по пути when Foo, поскольку Foo === attr будет иметь значение true из-за заглушки.

0 голосов
/ 30 апреля 2019

instance_double(Foo).class != Foo. Как вы уже видели, это возвращает объект InstanceDouble, который не будет работать в целях вашего сравнения.

Я бы заменил вашу строку instance_double на ручную реализацию и заглушку:

let(:foo) do
  foo = Foo.new
  allow(foo).to receive(:foo).and_return "some text"
  foo
end
let(:bar) { Bar.new(foo) }

Таким образом, foo.class == Foo, и он будет правильно работать в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...