Обойти инициализатор в спецификации - PullRequest
0 голосов
/ 11 марта 2011

У меня есть следующий метод для создания нового объекта подключения. Откроется последовательный порт. Обратите внимание, что произойдет сбой, если порт не существует.

class Connection
 def initialize(port)
   begin
      @serial = SerialPort.new(port, 9600, 8, 1, SerialPort::NONE)
    rescue
      exit(1)
    end
  end

  def send_command
    @serial.write "Something"
  end
end

Я написал спецификацию RSpec для этого метода, пока все хорошо. Теперь я хотел бы указать следующий метод, "send_command".

Проблема в том, что я не могу вызвать Connection.new("/some/port") в этой спецификации, так как он не будет работать (порт не существует). Как я могу обойти метод создания, не заглушая новый метод? Если я правильно понимаю, мне не разрешено заглушать или издеваться над классом, который я тестирую, верно?

Спасибо!

Ответы [ 3 ]

1 голос
/ 11 марта 2011

Вы можете передать объект SerialPort вместо номера порта (внедрение зависимости) или объект фабрики, у которого есть метод create, который возвращает объект SerialPort (абстрактный шаблон фабрики). Затем тесты могут проходить на фабрике поддельных / фиктивных / фиктивных SerialPort или SerialPort.

Но, может быть, во мне говорит программист на C ++, совет gnab выглядит более рубиново ...

1 голос
/ 11 марта 2011

Вы можете заглушить методы new и write класса SerialPort.

0 голосов
/ 14 марта 2011

Это несколько глупо, но вместо того, чтобы звонить Connection.new, вы можете позвонить Connection.allocate. Это создает объект без вызова initialize.

...