典型的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样式指南中列出。我可以看到为什么这会是一件好事,并将其添加到默认规则集中。但是,升级后,我们的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,通过编辑测试模板可以解决。
spec/
。