Un test unitaire RSpec typique fait un usage intensif de blocs Ruby imbriqués afin de structurer le code et d'utiliser la "magie" DSL pour que les spécifications soient lues comme des déclarations 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
Dans une spécification idéale, chaque exemple peut être relativement court et précis. Cependant, il semble habituel que les blocs extérieurs atteignent plus de 100 lignes, parce que la structure RSpec fonctionne de cette façon, et qu'il ne faut pas beaucoup d'exemples de spécifications, dont chacun peut avoir quelques lignes de configuration spécifique, pour arriver à describe
des blocs de taille égale ou supérieure au code du sujet décrit.
Une récente mise à jour de Rubocop a introduit une nouvelle règle, selon laquelle les blocs ne doivent pas dépasser 25 lignes. Je ne suis pas sûr de la raison de cette règle, car elle n'est pas mentionnée dans le manuel de Rubocop. Guide de style Ruby . Je peux voir pourquoi cela pourrait être une bonne chose, et ajouté aux règles par défaut. Cependant, après la mise à jour, notre test Rubocop échoue à plusieurs reprises avec des messages tels que tests/component_spec.rb:151:3: C: Block has too many lines. [68/25]
Avec des outils de mesure du code tels que Rubocop, j'ai comme d'avoir une politique de "Utiliser les valeurs par défaut, faire un lien vers le guide de style, travail terminé". (principalement parce que débattre des tabulations ou des espaces et d'autres minuties est une perte de temps, et que, selon l'EMI, il n'y a pas d'autre solution. jamais est résolu) Ici, ce n'est clairement pas possible, deux de nos principaux outils de qualité des données sont en désaccord sur l'approche de la disposition du code - ou du moins c'est ainsi que j'interprète les résultats, je ne vois rien d'intrinsèquement mauvais dans la façon dont nous avons écrit les spécifications.
En réponse, nous avons simplement fixé la règle de la taille des blocs Rubocop à un seuil élevé. Mais cela m'amène à me demander : qu'est-ce que je rate ? RSpec utilise-t-il une approche désormais discréditée pour l'agencement du code, et qu'est-ce que cela signifie ? raisonnable Est-ce que je dois réduire la taille des blocs dans nos tests RSpec ? Je vois des moyens de restructurer le code pour éviter les gros blocs, mais il s'agit sans exception de vilains bidouillages destinés uniquement à satisfaire la règle de Rubocop, par exemple en décomposant tous les blocs en fonctions d'aide :
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
. . . Je veux dire, c'est faisable, mais transformer des tas d'exemples de spécifications en fonctions d'aide de cette manière semble être à l'opposé de l'approche lisible encouragée par la conception de RSpec.
Y a-t-il autre chose que je puisse faire que de trouver des moyens de l'ignorer ?
La question existante la plus proche de ce sujet que j'ai pu trouver ici était la suivante RSpec & Rubocop / Ruby Style Guide et cela semblait pouvoir être résolu en modifiant les modèles de test.
3 votes
El paramètres par défaut d'excl excl exclure des fichiers sous
spec/
.1 votes
@Stefan : Ah, donc notre utilisation de
test/
nous a exposé à cela c'est bon à savoir. Cela signifie que les auteurs de Rubocop reconnaissent qu'il y a quelque chose de différent pour le code RSpec, et nous devrions en faire autant.