Заглушить установщик в RSpec instance_double

#ruby #unit-testing #rspec #mocking

#ruby #модульное тестирование #rspec #издевательство

Вопрос:

В модульном тестировании RSpec у меня есть макет, определенный следующим образом:

 let(:point) { instance_double("Point", :to_coords => [3,2]) }
  

В классе Point у меня также есть установщик, который используется в тестируемом классе (который называется Robot ). Я хотел бы заглушить этот установщик для тестирования Robot#move . Вот неправильный код, который у меня пока есть:

 describe "#move" do
  it "sets @x and @y one step forward in the direction the robot is facing" do
    point.stub(:coords=).and_return([4,2])
    robot.move
    expect(robot.position).to eq([4,2])
  end
end
  

Вот сообщение об ошибке, которое я получаю:

Double "Point (instance)" received unexpected message :stub with (:coords=)

Ответ №1:

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

 allow(point).to receive(:coords=).and_return([4,2])
  

stub Метод, по-видимому, устарел.

Ответ №2:

Другой вариант — заглушка метода установщика в определении double вот так:

 let(:point) { double("point", 'coords=' => [4,2]) }
  

Смотрите эту проблему на github для деталей.