Ruby 规范中的旁路初始值设定项

Ruby 规范中的旁路初始值设定项,ruby,rspec,bdd,stub,Ruby,Rspec,Bdd,Stub,我有以下方法来创建一个新的连接对象。它将打开一个串行端口。请注意,当端口不存在时,它将失败 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"

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

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”)
,因为它将失败(端口不存在)。如何绕过创建方法而不中断新方法?如果我理解正确,我就不允许存根或模拟我正在测试的类,对吗


谢谢

您可以存根
SerialPort
类的
new
write
方法。

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


<也许>这是C++程序员在我说的话,GnAB的建议似乎更为鲁莽…

< p>这有点古怪,但不是调用<代码>连接。新< /C> >,你可以调用<代码>连接。这会创建一个对象,而无需调用
initialize

谢谢gnab,困扰我的是我必须在每个描述块中执行它。我想知道存根Connection.new方法是否可以接受,或者存根是我正在测试的类的一个方法,因此是不可接受的?是的,关于依赖项注入,您是对的,这正是为什么测试更困难的原因。我将提取SerialPort类并将其作为参数传递。谢谢