【发布时间】:2023-03-21 06:45:02
【问题描述】:
典型的 RSpec 单元测试广泛使用嵌套的 Ruby 块来构建代码并利用 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
在理想的规范中,每个示例都可以相对简短而精确。然而,外部块似乎通常会增长到 100 行以上,因为 RSpec 结构以这种方式工作,并且不采用很多规范示例,每个示例都可能有几行特定设置,以到达 describe 块与所描述主题的代码大小相同或更大。
最近的 Rubocop 升级引入了一条新规则,即块不应超过 25 行。我不确定它的基本原理,因为它没有在Ruby style guide 中列出。我明白为什么它可能是一件好事,并添加到默认规则集中。但是,升级后,我们的 Rubocop 测试多次失败,并显示类似 tests/component_spec.rb:151:3: C: Block has too many lines. [68/25] 的消息
使用 Rubocop 等代码度量工具,我喜欢拥有“使用默认值,链接到样式指南,完成工作”的策略。 (主要是因为争论制表符与空格和其他细节是在浪费时间,而 IME 永远不会得到解决)这显然是不可能的,我们的两个核心数据质量工具不同意代码布局方法 - 或者至少这就是我解释结果的方式,我认为我们编写规范的方式没有任何本质上的错误。
作为回应,我们简单地将 Rubocop 块大小规则设置为高阈值。但这让我想知道——我错过了什么? RSpec 是否在代码布局中使用了一种现在已经名誉扫地的方法,在我们的 RSpec 测试中,我必须有哪些合理选项来减少块大小?我可以看到重组代码以避免大块的方法,但它们毫无例外都是丑陋的黑客,纯粹是为了满足 Rubocop 的规则,例如将所有块分解为辅助函数:
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,这看起来可以通过编辑测试模板来解决。
【问题讨论】:
-
default settings 排除
spec/下的文件。 -
@Stefan:啊,所以我们对
test/的使用让我们暴露了这一点。 . .很高兴知道。这意味着 Rubocop 作者承认 RSpec 代码有些不同,我们也应该这样做。