2017-10-14 54 views
0

如何在RSpec中存檔Array#sample的返回值?如何用RSpec存儲#sample?

鑑於我測試的方法包含以下行:

["Rock", "Paper", "Scissors"].sample

我需要像下面這行,不存根行爲。

allow(Array).to receive(:sample) { "Rock" }

+2

我會將'[「Rock」,「Paper」,「Scissors」]。sample'部分提取到方法中並對該方法進行存根。 – Stefan

回答

0

我勸你不要來,踩像數組這樣的常用類。 您可以通過其他測試和代碼獲得不可預知的後果。 正如Stefan在他的評論中所建議的那樣,您應該將["Rock", "Paper", "Scissors"].sample解壓到單獨的包裝器方法中,並存根這個方法。

使用這種方法,您將以安全的方式隔離這些代碼以便存根。

0

正如斯坦尼斯拉夫暗示,如果你存根方法,你需要一個處理接收該方法的對象的句柄。

在這種情況下,它是一個數組,而不是陣列的實例,要存根上,例如:

class MyClass 
    def pick_random(list) 
    list.sample 
    end 
end 
list = [1,2,3] 
expect(list).to receive(:sample).and_return(1) 
MyClass.new.pick_random(list) 

你需要勤奮的方式,你如果你想以這種方式存根,建立你的方法。例如,如果你決定定義方法裏面的名單,它將基本上從外部隱藏起來,並不可能直接存根:

class MyClass 
    def pick_random 
    [1,2,3].sample 
    end 
end 

# This wouldn't work because even though they contain the same elements, 
# the list here and in pick_random are different. 
expect([1,2,3]).to receive(sample).and_return(1) 
MyClass.new.pick_random 

這種方法對各種嘲諷的非常標準,但與基於隨機性方法如sample您也可以使用srand