gpt4 book ai didi

ruby - Rubocop 25 行 block 大小和 RSpec 测试

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

典型的 RSpec 单元测试广泛使用嵌套的 Ruby block 来构建代码并利用 DSL“魔法”让规范像 BDD 语句一样阅读:

describe Foo do
context "with a bar" do
before :each do
subject { Foo.new().add_bar }
end

it "looks like a baz" do
expect # etc

在理想的规范中,每个示例都可以相对简短和精确。然而,外部 block 增长到 100 行以上似乎很常见,因为 RSpec 结构以这种方式工作,并且没有采用很多规范示例,每个示例可能有几行特定设置,以获取 describe 与所描述主题的代码大小相同或更大的 block 。

Rubocop 最近的升级引入了一条新规则,即 block 不应超过 25 行。我不确定它的基本原理,因为它没有列在 Ruby style guide 中。 .我明白为什么它可能是一件好事,并添加到默认规则集中。但是,升级后,我们的 Rubocop 测试多次失败,并显示类似 tests/component_spec.rb:151:3: C: Block has too many lines 的消息。 [68/25]

使用 Rubocop 等代码度量工具,我喜欢制定“使用默认值,链接到样式指南,完成工作”的策略。 (主要是因为争论制表符与空格和其他细节是在浪费时间,而 IME 从未 得到解决)这显然是不可能的,我们的两个核心数据质量工具不同意代码布局方法 - 或者至少这就是我解释结果的方式,我没有发现我们编写规范的方式有任何本质上的错误。

作为回应,我们只是将 Rubocop block 大小规则设置为一个高阈值。但这让我想知道——我错过了什么? RSpec 是否使用了一种现在不可信的代码布局方法,以及我必须使用哪些合理选项来减少我们的 RSpec 测试中的 block 大小?我可以看到重组代码以避免大块的方法,但它们无一异常(exception)都是丑陋的黑客,纯粹是为了满足 Rubocop 的规则,例如将所有 block 分解为辅助函数:

def looks_like_a_baz
it "looks like a baz" do
expect # etc
end
end

def bar_context
context "with a bar" do
before :each do
subject { Foo.new().add_bar }
end
looks_like_a_baz
end
end


describe Foo do
bar_context
# etc

. . .我的意思是,这是可行的,但以这种方式将大量规范示例转换为辅助函数似乎与 RSpec 设计鼓励的可读方法相反。

除了想办法忽略它,我还能做些什么吗?


关于此主题,我能找到的最接近的现有问题是 RSpec & Rubocop / Ruby Style Guide这看起来可以通过编辑测试模板来解决。

最佳答案

如果特定 block 通常太长,我会指定它而不是文件

Metrics/BlockLength:
IgnoredMethods: ['describe', 'context']

关于ruby - Rubocop 25 行 block 大小和 RSpec 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40934345/

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