Типичный RSpec unit test широко использует вложенные блоки 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
., Я имею в виду, что do-able, но превращение пучков примеров spec в вспомогательные функции таким образом, похоже, противоположно читаемому подходу, разработанному дизайном RSpec.
Есть ли что-нибудь еще, что я могу сделать, кроме как найти способы игнорировать его?
Ближайший существующий вопрос, который я мог найти по этой теме, был RSpec и Rubocop/Ruby Style Guide, и это выглядело разрешимым путем редактирования тестовых шаблонов.