2012-10-18 47 views
1

問題我一直在學習Ruby,並且遇到了問題。我正在構建一個戰艦遊戲來學習這門語言。紅寶石模擬IO - 選擇

遊戲發生2輸入和2個輸出流到構造(允許兩個客戶端從相同的終端玩,無論是從網絡的連接,或一個來自每個)

也能正常工作的遊戲本身,但是因爲我也在嘗試以測試驅動的開發方式工作。這引起了一個問題 - 用於測試(RSpec的),我嘲笑的輸入和輸出

@outputIO = mock("io") 
@inputIO = mock("io") 

一個IO對象這個偉大的工程的大部分工作,但是某些部分需要使用SELECT命令,使雙方玩家可以在同一時間內輸入查詢信息:

result = select([@p1_input,@p2_input], nil, nil) 
for r in result[0] 
    if r == @p1_input || r == @p2_input 
    input = r 
    end 
end 

@ p1_input和@ p2_input在構造函數中進行設置。當我運行rspec測試時,我得到:

TypeError: can't convert RSpec::Mocks::Mock into IO 

我該如何模擬IO以使其正常工作?我應該創建一個新的IO實例並覆蓋gets方法,而不是模擬嗎?這足夠嗎?

在此先感謝。

回答

0

測試做IO的時候我喜歡用StringIO的:http://www.ruby-doc.org/stdlib-1.9.3/libdoc/stringio/rdoc/StringIO.html

,當你依靠低層次的方法,如選擇,我認爲這不是嘲笑或存根出這些零件一個很好的主意。你不會得到任何形式的。嘗試在你的測試中做真正的東西,但重新構造那裏的所有邏輯,以便你可以進行正常的測試。

+0

StringIO不能與IO.select一起工作,所以這沒什麼幫助,在這裏... –

+1

不,但你可以使用'IO.pipe'來創建測試通道 – phoet

+0

嗯......有點重量級的比較一個模擬,但是。 –