簡體   English   中英

如何在RSpec中模擬Ruby的“ require”語句?

[英]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有關,而這不是期望的一部分。 我的猜測是,我們僅測試自我接收到的requirewith_fileand_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM