gpt4 book ai didi

ruby - 如何防止 RSpec 隐藏缺失的依赖项?

转载 作者:数据小太阳 更新时间:2023-10-29 08:50:44 24 4
gpt4 key购买 nike

我有一个 Ruby 程序,它在运行时失败,但当我用 RSpec 测试它时却能正常工作。我知道错误的原因以及如何修复它(见下文),但我不知道如何构建一个失败的 RSpec 测试来证明错误的存在。

想象一下下面的 Ruby:

foobar.rb

class Foobar
attr_reader :fruit
def initialize
@fruit = Set.new ["Apple", "Banana", "Kiwi"]
end
end

上面的代码使用了一个Set,但是它没有“require 'set'”。这会导致它在运行时失败:

$ irb
> require './foobar.rb'
> f = Foobar.new
NameError: uninitialized constant Foobar::Set

在修复疏忽之前,我想构建一个简单的 RSpec 测试来证明错误。我的测试看起来像这样:

foobar_spec.rb

require 'rspec'
require './foobar.rb'

describe Foobar do
it "can be initialized" do
expect { Foobar.new }.to_not raise_error
end
end

运行测试,我很惊讶地看到它通过了:

$ rspec foobar_spec.rb
.

Finished in 0.00198 seconds
1 example, 0 failures

经过一些挖掘,我了解到 RSpec 会为自己加载 Set。这导致 Set 可用于它测试的代码,并且在我的例子中隐藏了一个错误。

我在测试中想到了“卸载/取消要求”设置。我最接近的是这段代码:

Object.send(:remove_const, :Set)

这确实导致测试失败,但不幸的是,它也阻止了 Set 被 future 的'require'再次加载,这意味着即使我在 foobar 中添加了 require 'set' 之后它仍然失败.rb.

有没有更好的方法在运行时卸载 gems?如果没有,我该怎么做才能让这个测试按预期失败?

最佳答案

require 'rspec'

describe 'foobar.rb' do
it "can instantiate Foobar" do
`ruby -e 'Foobar.new' -r./foobar.rb`
$?.exitstatus.should == 0
end
end

适用于您提到的一个案例。也就是说,我不推荐这种方法。要涵盖引用类的所有情况,您需要以这种方式运行所有规范,因为类引用可能出现在代码中的任何位置。

关于ruby - 如何防止 RSpec 隐藏缺失的依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13667900/

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