2011-01-28 38 views
1

我正在構建一個非常小的寶石來讀取圖像數據格式,並返回圖像作爲一個無聊的紅寶石數組,或一個不錯的narray,這取決於a)是否已經請求了一個敘述和b)如果該narray寶石是可用和需要。我的設計是,如果有人想使用他們可以的,但他們必須事先明確要求。當讀取圖像數據時,我檢查是否定義了narray(已經被要求),並且簡單地向msg實例變量添加警告以用於以後的打印/記錄。顯式測試庫/ gems是否通過在rspec中存根來定義?

我想包括一個測試(我使用RSpec2和摩卡嘲笑),但我有點新的實際使用rspec。我想這樣做:

it "should return an narray if requested" do 
    obj = NRead.new(@string, :bin => true, :narray => true) 
    obj.image_narray.should_not be_nil 
end 

it "should add an NArray Install message and not set the image_narray if NArray was not available" do 
    Object.stubs(:defined?).with(:NArray).returns(:false) 
    obj = NRead.new(@string, :bin => true, :narray => true) 
    obj.msg.should_not be_empty 
    obj.msg.grep(/Please gem install narray/).empty.should be_false 
    obj.image_narray.should be_nil 
    obj.image_ruby_array.size.should == @fixture_image_length 
end 

...但我必須失去使用存根的點,因爲這個磕碰是不會改變的定義的行爲?無論存根,定義?返回「真實」值(即,如果我取消註釋代碼中的要求,定義?爲假,並且我的警告已成功添加)。

這是否值得測試?有一個更好的方法嗎?任何想法將不勝感激。謝謝,

回答

2

定義?不是Object的一種方法。這就是爲什麼你的存根不工作。這是一個紅寶石運算符。我不確定如何剔除運營商。這絕對值得進行測試,因爲它對代碼的運行非常重要。

爲了測試這一點,你可以彈出寶石出$」陣列以及紅寶石它具有kernel.load信息和塊之前調用。

Object.send(:remove_const, :NArray) 

接着在塊之後就可以rerequire它是有點不好意思,也許有更好的辦法。

+0

嗯,這是有道理的。我很習慣操作員是合成糖的方法,我只是假設發生了什麼事情。但是這給了我一個想法 - 我可以添加一個基本上只返回defined的方法,因爲我可以存儲這個,我不確定這比.remove_const更不容易,只需要爲測試改變我的代碼。我可能只是用你的方法去。謝謝! – 2011-01-30 00:44:29

相關問題