2012-11-06 30 views
3

我有一個方法,將代碼塊作爲參數。問題是:如果此方法稱爲塊,如何使用RSpec進行測試?RSpec - 測試如果方法稱爲其塊參數

該塊可以在該方法需要的任何範圍內評估,不一定使用yieldblock.call。它被傳遞給另一個類,或者在匿名類對象或其他地方評估它。爲了讓測試通過,它足以在方法調用的結果中評估塊。

有沒有辦法使用RSpec來測試這樣的事情?


this見與lets和嘲笑更復雜的情況。

+2

創建一個副作用的塊,如設置一個封閉變量我們引發一個異常,並檢查副作用? –

+0

感謝您的想法!特別是在這種情況下,有例外的概念是有希望的。 – wrzasa

回答

2

我平時做這樣的事情

a = 1 
b.go { a = 2} 
a.should == 2 
+0

這個也可以!簡單而有效!謝謝;-)還添加了額外的信息''應''測試,以防止混淆,像[這裏](http://stackoverflow.com/questions/4183656/how-to-attach-message-to-rspec-check) – wrzasa

1

感謝戴夫牛頓在評論上述建議我做了這樣的事情:

it "should run block defining the node" do 
    message="This message is raised if block is properly evaluated." 
    expect do 
    node do 
     raise message 
    end 
    end.to raise_error message 
end 

在錯誤的情況下,這個打印消息:

Failure/Error: expect do 
    expected Exception with "This message is raised if block is properly evaluated." but nothing was raised 

,我覺得足夠信息。

再次感謝您的幫助!

2

我喜歡用throw代替raise對於這類問題,因爲它不能被搶救是任意的救援處理程序。所以它可能看起來像這樣:

my_proc = proc { throw :my_proc_was_called } 
expect { 
    my_proc.call 
}.to throw_symbol :my_proc_was_called