rubocop rspe c ruby2.4-строгое правило MultilineBlockLayout и конфликт NamedSubject - PullRequest
1 голос
/ 17 марта 2020

У меня следующий код rspe c ruby. Я тестирую некоторые кукольные модули. Выдает ошибку linting.

Block body expression is on the same line as the block start. (convention:Layout/MultilineBlockLayout)

describe "on #{os}" do
  let(:facts) { facts }      

  it { is_expected.to contain_class('windows_some_thing::some_suite') }
  context 'with some_suite_enabled' do
    let(:params) { { cipher_suite: %w[ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521 ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521 ] } }

    it { is_expected.to contain_registry_value('HKLM\SOFTWARE\Policies\Microsoft\something\something\something\000000\Functions').with(
        ensure: 'present',
        type: 'string',
        data: 'ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521,ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521 ',
      )
    }
  end

Я могу использовать rubocop -a, чтобы исправить это. Однако это исправляет код в соответствии с ниже. А затем получить другую ошибку linting

Name your test subject if you need to reference it explicitly. (convention:RSpec/NamedSubject)

    it {
      expect(subject).to contain_registry_value('HKLM\SOFTWARE\Policies\Microsoft\something\something\something\000000\Functions').with(
        ensure: 'present',
        type: 'string',
        data: 'ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521,ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521 ',
      )
    }

Как я могу исправить это для ruby-2.4-strict? У меня более 10000 ошибок линтинга, которые мне нужно исправить. распределить по нескольким файлам и модулям. Поэтому мне нужно практичное прямолинейное решение. Я знаю, что это займет довольно много времени. Но я не хочу, чтобы это заняло остаток года.

1 Ответ

1 голос
/ 17 марта 2020

Более простая и прямая коррекция для

Block body expression is on the same line as the block start. (convention:Layout/MultilineBlockLayout)

может включать следующее:

it {
  is_expected.to contain_registry_value('HKLM\SOFTWARE\Policies\Microsoft\something\something\something\000000\Functions').with(
    ensure: 'present',
    type: 'string',
    data: 'ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521,ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521 ',
  )
}

Правило состоит в том, что старт и конечные разделители блока multiline должны появляться на отдельных строках от чего-либо (кроме пробелов) в теле блока.

Это также все равно будет поднимать флаг, но тот, чье исправление более очевидно. Линтер хочет, чтобы вы использовали do и end для разграничения многострочных блоков, так что это то, где вы в конечном итоге хотите быть:

it do
  is_expected.to contain_registry_value('HKLM\SOFTWARE\Policies\Microsoft\something\something\something\000000\Functions').with(
    ensure: 'present',
    type: 'string',
    data: 'ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521,ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521 ',
  )
end

Или, может быть, даже здесь:

it do
  is_expected.to contain_registry_value('HKLM\SOFTWARE\Policies\Microsoft\something\something\something\000000\Functions')
    .with(
      ensure: 'present',
      type: 'string',
      data: 'ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521,ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521 ',
    )
end

Я считаю этот последний более читабельным, особенно если вы хотите связать дополнительные предикаты.

...