2015-07-27 2 views
1

У меня есть функция, которую я вызываю, что мне нужно проверить аргументы. Обычно я хотел бы сделать что-то вроде:Отрицательный аргумент в RSpec 3

expect(my_obj).to_receive(:my_function).with(include('good_value')) 

Есть ли способ, чтобы перевернуть это вокруг, хотя, чтобы быть что-то вроде

expect(my_obj).to_receive(:my_function).with(exclude('bad_value')) 

В спецификации на возвращаемом значении это просто выполняется с помощью to_not , но эта форма отрицания недоступна при сопоставлении аргументов. Я не могу найти ничего в документах, предлагающих способ сделать это иначе, чем писать пользовательский матчи, который чувствует себя излишним здесь.

Есть ли простой способ, которым я могу это сделать без необходимости писать пользовательский матчи?

ответ

1

RSpec 3.1+ позволяет определить отрицание версии любой согласовани с помощью RSpec::Matchers.define_negated_matcher:

RSpec::Matchers.define_negated_matcher :exclude, :include 

После того, как вы сделали это, это должно работать:

expect(my_obj).to_receive(:my_function).with(exclude('bad_value')) 
+0

хорошо, я думаю, это лучшее, что я собираюсь получить, но от чтения документов, которые я сделал «Я понимаю, что это один лайнер, который я мог бы разместить в моем помощнике по спецификации, так что это работает. благодаря! –

1

Вы можете попробовать:

http://www.rubydoc.info/gems/rspec-mocks/RSpec/Mocks/ArgumentMatchers#hash_excluding-instance_method

expect(object).to receive(:message).with(hash_excluding(:key => val)) 
+0

К сожалению, это не хэш: мне нужен более общий 'include' matcher –

+0

yes Я предполагал, что, но также и один принцип TDD - позволить тестовому диску дизайн, поэтому, возможно, проще адаптировать вашу реализацию, чтобы иметь это легче проверить, и, может быть, ваш метод также в конечном итоге исходит из этого рефакторинга;) (вот почему я дал этот ответ) – jethroo