[英]How can I mock a Ruby “require” statement in RSpec?
我有一個Ruby cli程序,可以選擇通過require
加載用戶指定的文件。 我想通過RSpec對該功能進行單元測試。 顯而易見的事情是模擬需求並驗證它是否已發生。 像這樣:
context 'with the --require option' do
let(:file) { "test_require.rb" }
let(:args) { ["--require", "#{file}"] }
it "loads the specified file"
expect(...something...).to receive(:require).with(file).and_return(true)
command.start(args)
end
end
(這只是輸入,而不是復制/粘貼-實際的代碼會使問題難以理解。)
不管我怎么努力,我無法捕捉的require
,即使它發生(它提出了一個LoadError
,這樣我就可以看到)。 我嘗試了多種方法,包括最明顯的方法:
expect(Kernel).to receive(:require).with(file).and_return(true)
甚至:
let(:kernel_class) { class_double('Kernel') }
kernel_class.as_stubbed_const
allow(Kernel).to receive(:require).and_call_original
allow(Kernel).to receive(:require).with(file).and_return(true)
但似乎沒有鈎住require
有什么建議嗎?
因此require
是由Kernel
定義的,但是Kernel
包含在Object
因此當您在此上下文中調用require
時,處理該語句的不一定是Kernel
模塊。
更新資料
我不確定這是否能解決您的問題,但不會出現以下異常行為:
file = 'non-existent-file'
allow(self).to receive(:require).with(file).and_return(true)
expect(self).to receive(:require).with(file)
expect(require file).to eq(true)
老答案:
這是不正確的,並且由於收到的過高票數僅在后代存在。 沒有allow
一些工作原理。 如果有人可以解釋我為什么應該提出來,為什么會喜歡。 我認為問題與and_return
有關,而這不是期望的一部分。 我的猜測是,我們僅測試自我接收到的require
, with_file
和and_return
部分只是消息傳輸(因此,我更新的答案)
您仍然可以像這樣存根:
file = 'non-existent-file.rb'
allow_any_instance_of(Kernel).to receive(:require).with(file).and_return(true)
expect(self).to receive(:require).with(file).and_return(true)
require file
由於您對這個問題感到困惑,因此我不清楚您的確切實現方式,因此我無法解決您的確切問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.