典型的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
在理想的规范中,每个示例都可以相对简短和精确.然而,通常情况下,外部块会增加到describe
多行,因为RSpec struct 是这样工作的,并且不会采取很多规范示例(每个示例可能有几行特定设置)来获得describe
个与所描述主题的代码大小相同或更大的块.
最近对Rubocop的升级带来了一条新规则,即区块长度不得超过25行.我不确定这样做的理由,因为它没有被列入Ruby style guide强.我明白了为什么这可能是一件好事,并添加到了默认规则集.然而,升级后,我们的Rubocop测试多次失败,出现tests/component_spec.rb:151:3: C: Block has too many lines. [68/25]
这样的消息
使用Rubocop等代码度量工具,我希望有一个"使用默认值、链接到样式指南、完成工作"的策略(主要是因为讨论制表符与空格以及其他细节是在浪费时间,IME never得到了解决)在这里,这显然是不可能的,我们的两个核心数据质量工具对代码布局方法存在分歧——或者至少这是我解释结果的方式,我认为我们编写规范的方式没有本质上的错误.
作为回应,我们只需将Rubocop块大小规则设置为一个高阈值.但这让我想知道——我错过了什么?RSpec使用的是现在不可信的代码布局方法吗?在我们的RSpec测试中,我有哪些reasonable个选项可以减少块大小?我可以找到重组代码的方法,以避免出现大的代码块,但它们毫无例外都是丑陋的黑客行为,纯粹是为了满足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个,这看起来可以通过编辑测试模板来解决.