#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 для деталей.