Используйте double для переменной экземпляра объекта в Rspec

#ruby #rspec #mocking #double #stub

#ruby #rspec #издевательство #double #заглушка

Вопрос:

Я довольно новичок в Ruby, и это мой первый вопрос по stackoverflow, поэтому, пожалуйста, будьте терпеливы со мной, хе-хе.

Я изо всех сил пытаюсь пройти тест Rpec, используя double.

У меня есть класс Plane, у которого есть attr_reader :plane_number из его метода инициализации @plane_number = plane_number . attr_reader:plane_number

 Class Plane   
   def initialize
   @plane_number = plane_number   
   end
end
  

Я использую эту переменную в другом классе Airport для ссылки на конкретный самолет с его номером самолета в строковом сообщении. Примером строки в моем коде является:

 class Airport
  def confirms_landed(plane)
  "The plane #{plane.plane_number} has landed"
  end
end
  

Я создал тест с помощью Rspec, используя double для экземпляра плоскости, используя let(:plane) {double :plane}
Но я не уверен, как использовать double для переменной plane_number.

 describe Airport do
let(:plane) {double :plane}
   it "confirms a plane has landed" do
   subject.confirms_landed(plane)
   expect(subject.confirms_landed(plane)).to eq("The plane #{plane.plane_number} has landed")
   end
end
  

Код работает нормально и возвращает правильную строку с номером плоскости в ней, однако тест завершается неудачей, поскольку я не присваиваю double переменной plane_number (я получаю это сообщение об ошибке: Double:plane получил неожиданное сообщение: plane_number с (без аргументов))

Я уверен, что это очень просто исправить, но, похоже, я не могу найти правильный ответ.

Комментарии:

1. double :plane, plane_number: 10

Ответ №1:

Из того, что я вижу, вам просто не хватает метода номера плоскости в double

 class Airport
  def confirms_landed(plane)
    "The plane #{plane.plane_number} has landed"
  end
end

describe Airport do
  let(:plane) { double(:plane, plane_number: 56) }

  it "confirms a plane has landed" do
      expect(subject.confirms_landed(plane)).to eq("The plane 56 has landed")
  end
end