在规格中绕过初始化程序

时间:2011-03-11 08:50:44

标签: ruby rspec bdd stub

我有以下方法来创建一个新的Connection对象。它将打开一个串口。请注意,当端口不存在时,它将失败。

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 个答案:

答案 0 :(得分:1)

您可以存根new类的writeSerialPort方法。

答案 1 :(得分:1)

您可以传入SerialPort对象而不是端口号(依赖注入),或者传递具有返回SerialPort对象(抽象工厂模式)的create方法的工厂对象。然后,测试可以通过假/模拟/虚拟SerialPort或SerialPort工厂传递。

但也许这就是我所说的C ++程序员,gnab的建议似乎更像Rubyish ......

答案 2 :(得分:0)

这有些苛刻,但您可以致电Connection.new而不是致电Connection.allocate。这会在不调用initialize的情况下创建一个对象。