【问题标题】:Bypass initializer in specs绕过规范中的初始化程序
【发布时间】:2011-03-11 08:50:44
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: ruby rspec bdd stub


    【解决方案1】:

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

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

    【讨论】:

    • 是的,你对依赖注入的看法是对的,这正是它更难测试的原因。我将提取 SerialPort 类并将其作为参数传递。谢谢!
    【解决方案2】:

    您可以存根 SerialPort 类的 newwrite 方法。

    【讨论】:

    • 感谢 gnab,困扰我的是我必须在每个描述块中都这样做。我想知道存根 Connection.new 方法是否可以接受,还是存根我正在测试的类的方法,因此是不可接受的?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 2012-05-11
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      相关资源
      最近更新 更多