2014-03-03 54 views
1

我正在寫一些測試,我想斷言某些方法實際上調用了我已經存根的對象上的賦值方法。Rspec期望賦值(=)方法被調用

我也試着這樣做:

expect(test_object.some_object[:whatever]).to receive(:=).with(some_data) #Does NOT work 

test_object.method() 

這似乎並沒有工作。有沒有辦法讓我做到這一點?


之所以這樣做是,「some_object」是一個開放的結構對象,它是一個替身,我不想測試時調用外部庫。

回答

0

Ruby中沒有這樣的「賦值方法」。當你在Ruby中爲變量賦值(例如局部變量,實例變量,類變量)時,你並沒有調用方法。該變量是一個對象的「容器」,並且RSpec無法跟蹤是否發生對變量的賦值。

對此規則進行排序的一個例外是所謂的「setter」方法,與attr_writerattr_accessor一起使用。在這種情況下,你仍然沒有一個分配方法本身,但是如果你定義一個方法如:

class MyObject 
    def my_attribute=(value) 
    ... 
    end 
end 

或使用等效attr_...電話,然後將以下代碼:

MyObject.new.my_attribute = 'foo' 

將被視爲

MyObject.new.my_attribute=('foo') 

,您可以存根或設置在my_attribute=方法像任何其他方法的期望。

+0

我的印象是,無論是賦值運算符和其他運營商如+, - 和*所有都爲方法的簡寫。也許我誤解了。你有什麼好的參考資料可以在這裏看到嗎? – Automatico

+0

(要查看我的觀點,請看這裏:[http://ruby.about.com/od/oo/ss/Overloading-Operators.htm](http://ruby.about.com/od/oo/ ss/Overloading-Operators.htm)) – Automatico

+0

儘管許多操作符都變爲方法調用,但賦值操作符是一個例外,正如您提供的參考資料中所述。 –

1

實例變量賦值可以得到驗證:

# checks @whatever 
expect(assigns(test_object.some_object[:whatever])).to eq(some_data) 
test_object.method()