如何在RSpec中存檔Array#sample
的返回值?如何用RSpec存儲#sample?
鑑於我測試的方法包含以下行:
["Rock", "Paper", "Scissors"].sample
我需要像下面這行,不存根行爲。
allow(Array).to receive(:sample) { "Rock" }
如何在RSpec中存檔Array#sample
的返回值?如何用RSpec存儲#sample?
鑑於我測試的方法包含以下行:
["Rock", "Paper", "Scissors"].sample
我需要像下面這行,不存根行爲。
allow(Array).to receive(:sample) { "Rock" }
我勸你不要來,踩像數組這樣的常用類。 您可以通過其他測試和代碼獲得不可預知的後果。 正如Stefan在他的評論中所建議的那樣,您應該將["Rock", "Paper", "Scissors"].sample
解壓到單獨的包裝器方法中,並存根這個方法。
使用這種方法,您將以安全的方式隔離這些代碼以便存根。
正如斯坦尼斯拉夫暗示,如果你存根方法,你需要一個處理接收該方法的對象的句柄。
在這種情況下,它是一個數組,而不是類陣列的實例,要存根上,例如:
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。
我會將'[「Rock」,「Paper」,「Scissors」]。sample'部分提取到方法中並對該方法進行存根。 – Stefan