我有以下方法来创建一个新的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")
,因为它将失败(端口不存在)。如何在不删除新方法的情况下绕过创建方法?如果我理解正确,我不允许存根或嘲笑我正在测试的课程,对吗?
谢谢!
答案 0 :(得分:1)
您可以存根new
类的write
和SerialPort
方法。
答案 1 :(得分:1)
您可以传入SerialPort对象而不是端口号(依赖注入),或者传递具有返回SerialPort对象(抽象工厂模式)的create方法的工厂对象。然后,测试可以通过假/模拟/虚拟SerialPort或SerialPort工厂传递。
但也许这就是我所说的C ++程序员,gnab的建议似乎更像Rubyish ......
答案 2 :(得分:0)
这有些苛刻,但您可以致电Connection.new
而不是致电Connection.allocate
。这会在不调用initialize
的情况下创建一个对象。