Есть ли способ в RSpec дать "не" более высокий приоритет, чем все сопоставители?
RSpec 3 обеспечивает все совпадения. Например,
expect(['Tom', 'Tony', 'Rosa']).to all( include("o") )
Вы также можете иметь
expect(['Tom', 'Tony', 'Rosa']).to_not all( include("o") )
Но как вы выражаете "всем нет"?
2 ответа
Решение
Определите отрицательную версию средства сопоставления, с которым вы хотите проверить каждый элемент списка, например,
RSpec::Matchers.define_negated_matcher :exclude, :include
и использовать его как
expect(%w(Tom Tony Rosa)).to all(exclude('o'))
Согласно документации и быстрому прочтению кода, похоже, нет встроенного all_not
matcher, так что для достижения результата нужно выполнить итерацию по массиву следующим образом:
['Tom', 'Tony', 'Rosa'].each { |name| expect(name).to_not contain('o') }
Вы можете просмотреть встроенные совпадения, в том числе all
по адресу https://github.com/rspec/rspec-expectations/blob/9ff22694fa88cb0b0e794b6f99f3cfacfa909bf4/lib/rspec/matchers/built_in/all.rb