Faker не будет кодировать для вас. Он просто даст вам строку, такую как O'Malley
. Но ответ должен иметь HTML-экранирование (или какой-либо другой вид, в зависимости от формата), например O'Malley
. Вы всегда можете найти puts response.body
, чтобы убедиться в этом.
Совместимость RSpec matches
действительно разработан for either expected
or actual
to be a regular expression, но в вашем случае оба являются строками. Потому что код has an optimization calling values_match?
, который does a simple comparison, вы фактически говорите expect(response.body).to eq(@thing.name)
.
Если вы хотите получить регулярное выражение, вы правы, что вы должны быть осторожны с использованием неконтролируемых значений для его создания. К счастью, у Ruby есть Regexp.escape
, поэтому вы можете сказать Regexp.new("foo" + Regexp.escape(@thing.name) + "bar")
. Но от вашего возражения до include
это звучит так, будто вы действительно хотите, чтобы в ответе содержалось только имя, не так ли? В этом случае вам не нужно регулярное выражение вообще.
В любом случае проблема не в том, что такое вокруг имя, но как имя скроется. Поэтому перед сравнением вы должны либо (1) декодировать ответ, либо (2) закодировать строку фейкера. На самом деле это не имеет значения. И довольно легко:
expect(CGI.unescapeHTML(response.body)).to eq @thing.name
или
expect(response.body).to eq CGI.escapeHTML(@thing.name)
Естественно, если ваш ответ JSON, вы должны заменить весь этот HTML вытекающего материал с JSON и т.д.
Мне любопытно, почему вы чувствовали, что мой ответ был недостаточным. Что я могу прояснить? –
Проблема с include заключается в том, что если он «содержит» его, я хочу, чтобы он полностью соответствовал ему, а не только слово «существует» внутри имени. Хотя я могу использовать его в качестве резервной копии, в которой неправильный ответ на ваш ответ правильный. Я действительно просто пытаюсь найти другие возможности. – msmith1114