0

我有以下方法来创建一个新的 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")这个规范,因为它会失败(端口不存在)。如何绕过创建方法而不存根新方法?如果我理解正确,我不允许对我正在测试的课程进行存根或模拟,对吗?

谢谢!

4

3 回答 3

1

你可以存根类的newwrite方法SerialPort

于 2011-03-11T08:55:04.533 回答
1

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

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

于 2011-03-11T09:05:38.280 回答
0

这有点骇人听闻,但Connection.new您可以调用 ,而不是调用Connection.allocate。这将创建一个对象而不调用initialize.

于 2011-03-13T22:59:36.400 回答