2011-03-11 77 views
0

我有以下方法來創建一個新的連接對象。它會打開一個串口。請注意,當端口不存在時它會失敗。規格中的旁路初始化器

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"),因爲它會失敗(端口不存在)。我怎樣才能繞過創建方法,而不會殘留新方法?如果我理解正確,我不允許存根或模擬正在測試的課程,對吧?

謝謝!

回答

1

您可以傳遞一個SerialPort對象而不是一個端口號(依賴注入),或者一個擁有返回SerialPort對象(抽象工廠模式)的create方法的工廠對象。然後這些測試可以通過僞/模擬/虛擬串行端口或串行端口工廠。

也許這是我的C++程序員交談,gnab的建議似乎更爲Rubyish ...

+0

是的,你對依賴注入是正確的,這正是爲什麼它更難以測試。我將提取SerialPort類並將其作爲參數傳遞。謝謝! – Cimm 2011-03-12 23:14:32

1

您可以對SerialPort類的newwrite方法進行存根。

+0

感謝gnab,困擾着我的是我必須在每個描述塊中完成它。我想知道是否可以接受Connection.new方法的存根,或者是對我正在測試的類的方法進行了存根,並且這樣做是不可接受的? – Cimm 2011-03-12 23:12:42

0

這有點哈克,但而不是調用Connection.new,你可以調用Connection.allocate。這會創建一個對象而不會調用initialize