2011-05-14 115 views
2

在rspec和類似的測試框架中,如何測試缺少方法?Ruby測試:缺少方法的測試

我剛剛開始擺弄rspec和培根(rspec的簡化版本)。我想定義測試,以確認一個類只允許讀訪問實例變量。所以,我想一個類,它看起來像:

class Alpha 
    attr_reader :readOnly 

    #... some methods 

end 

我寧願爲難:

it "will provide read-only access to the readOnly variable" do 
    # now what??? 
    end 

我沒有看到各類提供測試如何測試沒有存取方法。我是紅寶石和紅寶石測試中的noob,所以我可能錯過了一些簡單的東西。

+3

作爲一個側面說明,紅寶石蛇是由傳統的包裝。在方法和變量名稱中加下劃線。 – 2011-05-14 03:00:08

+0

是的,我知道,但我在Objective-C中用MacRuby工作很多,所以我傾向於使用camelCase出於習慣。我會盡量記住不要在我的文章中這樣做,因爲我知道不遵循約定會使代碼難以閱讀。 – TechZen 2011-05-14 12:46:14

回答

5

在Ruby中,你可以檢查對象響應與obj.respond_to?(:method_name)的方法,因此使用RSpec,你可以使用:

Alpha.new.should_not respond_to(:readOnly=) 

另外,因爲類可以覆蓋respond_to?方法,你可以嚴格,確保有是實際調用它,並聲稱它沒有提出分配方法:

expect { Alpha.new.readOnly = 'foo' }.to raise_error(NoMethodError) 

參考見RSpec Expectations

+1

這可能是以經典的鴨子打字方式做到這一點的最佳方式。對於後代,也可以檢查包含在對象的'方法'數組中:'Alpha.new.methods.include?(:readOnly =)' – 2011-05-14 04:13:57

+0

啊,是的,我正在努力做到這一點。出於某種原因,我認爲ruby由於鴨子打字而缺乏「類似於響應的功能」。大多數非靜態類型語言都有這樣的功能,我應該知道紅寶石也是如此。 – TechZen 2011-05-14 12:49:11

2

我相信你正在尋找respond_to?,如some_object.respond_to? :some_method