У меня следующая ситуация. У меня есть общий пример, который передается в некотором хеше как данные, а другой - с ожидаемыми данными. Упрощенно это выглядит так:
RSpec.describe "shared examples" do
shared_examples "matching hash" do |data, expected_data|
it 'matches' do
expect(data).to include (expected_data)
end
end
it_behaves_like "matching hash", { foo: '/foo/1', bar: '/bar' }, { foo: '/foo/1' }
end
Теперь у меня есть проблема, что для некоторых значений в хэше, содержащем URL, я не хочу проверять всю строку, а только начало. Таким образом, моя идея состояла в том, чтобы использовать устройство сравнения, как я обычно делаю, и передавать его внутри expected_data
.
RSpec.describe "shared examples with passed in matcher" do
shared_examples "matching hash" do |data, expected_data|
it 'matches' do
expect(data).to include (expected_data)
end
end
it_behaves_like "matching hash", { foo: '/foo/1' }, { foo: start_with('/foo/') }
end
К сожалению, это не с
Failure/Error: it_behaves_like "matching hash", { foo: '/foo/1' }, { foo: start_with('/foo/') }
`start_with` is not available on an example group (e.g. a `describe` or `context` block). It is only available from within individual examples (e.g. `it` blocks) or from constructs that run in the scope of an example (e.g. `before`, `let`, etc).
В этом конкретном случае я мог бы решить эту проблему, передав регулярное выражение вместо start_with
, или адаптировать общий пример, чтобы явно получить нечеткие данные и сравнить их с помощью сопоставителя.
Но мне было бы лучше, если бы был способ передать совпадения в общих примерах. Есть ли способ сделать это или это просто невозможно?