RSpec: используйте `receive ... точно ... with ... and_return ...` с разными `with` аргументами - PullRequest
1 голос
/ 05 апреля 2019

Я пишу ожидание, которое проверяет, вызывается ли метод два раза с разными аргументами, и возвращает разные значения.Сейчас я просто пишу ожидание дважды:

expect(ctx[:helpers]).to receive(:sanitize_strip).with(
  %{String\n<a href="http://localhost:3000/">description</a> <br/>and newline\n<br>},
  length: nil
).and_return('String description and newline')

expect(ctx[:helpers]).to receive(:sanitize_strip).with(
  %{String\n<a href="http://localhost:3000/">description</a> <br/>and newline\n<br>},
  length: 15
).and_return('String descr...')

Интересно, смогу ли я вместо этого использовать receive ... exactly ... with ... and_return ...;что-то вроде:

expect(ctx[:helpers]).to receive(:sanitize_strip).exactly(2).times.with(
  %{String\n<a href="http://localhost:3000/">description</a> <br/>and newline\n<br>},
  length: nil
).with(
  %{String\n<a href="http://localhost:3000/">description</a> <br/>and newline\n<br>},
  length: 15
).and_return('String descr...', 'String description and newline')

Приведенный выше код не работает, возникает следующая ошибка:

1) Types::Collection fields succeeds
   Failure/Error: context[:helpers].sanitize_strip(text, length: truncate_at)

     #<Double :helpers> received :sanitize_strip with unexpected arguments
       expected: ("String\n<a href=\"http://localhost:3000/\">description</a> <br/>and newline\n<br>", {:length=>15})
            got: ("String\n<a href=\"http://localhost:3000/\">description</a> <br/>and newline\n<br>", {:length=>nil})
     Diff:
     @@ -1,3 +1,3 @@
      ["String\n<a href=\"http://localhost:3000/\">description</a> <br/>and newline\n<br>",
     - {:length=>15}]
     + {:length=>nil}]

Есть ли способ использовать receive ... exactly ... with ... and_return ... с различными with аргументами

1 Ответ

1 голос
/ 09 мая 2019

Существует rspec-any_of гем , который допускает следующий синтаксис путем добавления all_of аргумента соответствия:

expect(ctx[:helpers]).to receive(:sanitize_strip).with(
  %{String\n<a href="http://localhost:3000/">description</a> <br/>and newline\n<br>}
  all_of({length: 15}, {length: nil})
)
.and_return('String descr...', 'String description and newline')
.twice
...