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类并将其作为参数传递。谢谢