gpt4 book ai didi

ruby - 如何 stub 发生在 File.open block 内的 file.read?

转载 作者:数据小太阳 更新时间:2023-10-29 06:57:58 25 4
gpt4 key购买 nike

如何 stub file.read 调用以便它返回我想要的内容?以下不起作用:

def write_something
File.open('file.txt') do |f|
return contents = f.read
end
end
# rspec
describe 'stub .read' do
it 'should work' do
File.stub(:read) { 'stubbed read' }
write_something.should == 'stubbed read'
end
end

看起来 stub 正在应用于 File 类,而不是我的 block 中的文件实例。所以 File.read 按预期返回 stubbed read。但是当我运行我的规范时它失败了。

最佳答案

我应该注意到 File.open 只是 Ruby 非常大的 I/O API 的一部分,因此您的测试很可能与您的实现紧密耦合,并且不太可能存活下来重构。此外,必须小心“全局”模拟(即常量或所有实例),因为它可能会无意中模拟其他地方的用法,从而导致令人困惑的错误和失败。

代替模拟,考虑在磁盘上创建一个实际文件(使用 Tempfile )或使用更广泛的 I/O 模拟库(例如 FakeFS )。

如果您仍然希望使用模拟,您可以稍微安全地 stub File.open 以产生 double (并且仅当使用正确的参数调用时):

file = instance_double(File, read: 'stubbed read')
allow(File).to receive(:open).and_call_original
allow(File).to receive(:open).with('file.txt') { |&block| block.call(file) }

或者,有点危险, stub 所有实例:

allow_any_instance_of(File).to receive(:read).and_return('stubbed read')

关于ruby - 如何 stub 发生在 File.open block 内的 file.read?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12344356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com