gpt4 book ai didi

ruby - 使用 RSpec(LeakyConstantDeclaration 问题)生成不泄漏的动态测试的最佳方法?

转载 作者:行者123 更新时间:2023-12-04 17:15:18 25 4
gpt4 key购买 nike

我正在接管一些 Ruby 代码,其中包括一个相当大的测试套件。我要添加的一件事是 rubocop来解决一些问题。我注意到的一件事是,许多测试已被设置为以如下方式动态生成:

describe 'some test' do
SOME_CONSTANT = { some hash }

SOME_CONSTANT.each do |param1, param2|
it 'does #{param1} and successfully checks #{param2} do
# do something with #{param1} or #{param2}
expect(param2).to eq "blahblah"
end
end
end
这里的问题是 SOME_CONSTANT .与 rubocop这失败了 RSpec/LeakyConstantDeclaration警察规则。这些测试设置这些常量的方式可能会意外地重新分配全局常量,如果人们不注意,则会导致其他地方的随机规范失败。
我发现的唯一可行的解​​决方案是将这些常量更改为实例变量。例如:
describe 'some test' do
@some_constant = { some hash }

@some_constant.each do |param1, param2|
it 'does #{param1} and successfully checks #{param2} do
# do something with #{param1} or #{param2}
expect(param2).to eq "blahblah"
end
end
end
这些实例变量也有可能泄漏到其他它/示例规范中(如果单个测试更改它,则在同一规范文件中),但至少它仅限于个人 *_spec.rb文件,并且不会影响整个测试套件的全局范围。这也修复了 RSpec/LeakyConstantDeclaration .
有人会有更好的建议吗?一个不使用实例变量,更现代的 RSpec 友好的?我试过使用 let , 和 let!但是测试的设置方式任何以这种方式设置的变量只能在 it 中访问块。也试过使用 stub_constbefore(:context)块,但遇到相同的问题,即 stub 常量只能在 it 内访问/ example语境。我什至也试过 RSpec.Mocks.with_temporary_scope和同样的问题。实例变量似乎是此设置中唯一有效的东西。
在此先感谢您提供任何有用的建议!

最佳答案

你提供的例子感觉有点像编程,而不是测试;例如我会尝试更明确一点,而不是添加行为循环。
想到了两个结构:

  • 使用 let (我知道你说过你做了),但有额外的嵌套。 IIRC,你也许可以再添加一个 describe阻止您的 each 之外区块
  • Shared examples .这是我首先要尝试的。我在下面添加了一些伪代码
  • describe 'my test' do
    shared_examples 'does the thing' do |arg1, arg2|
    before { arg1.call }

    it "does #{arg1} and returns #{arg2}" do
    expect(arg2).to eq(true)
    end
    end

    it_behaves_like 'does the thing', Foo.new, bar
    it_behaves_like 'does the thing', Blarge.new, blah
    end
    您还可以将它们与 let 和/或块结合使用(并重构共享示例以引用它们而不是显式传入参数
    it_behaves_like 'does the thing' do
    let(:method) { :foo }
    let(:result) { 42 }
    end

    关于ruby - 使用 RSpec(LeakyConstantDeclaration 问题)生成不泄漏的动态测试的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68809338/

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