Faker nie zrobi dla ciebie żadnego kodowania. Po prostu da ci ciąg znaków, taki jak O'Malley
. Ale odpowiedź powinna zawierać kod HTML (lub inny rodzaj, w zależności od formatu), taki jak O'Malley
. Zawsze możesz zobaczyć na pewno puts response.body
.
Matówka RSpec matches
jest naprawdę zaprojektowana for either expected
or actual
to be a regular expression, ale w twoim przypadku oba są ciągami. Ponieważ kod has an optimization calling values_match?
, który does a simple comparison, skutecznie mówi się: expect(response.body).to eq(@thing.name)
.
Jeśli chcesz mieć wyrażenie regularne, masz rację, że powinieneś być ostrożny przy użyciu niekontrolowanych wartości, aby go utworzyć. Na szczęście Ruby ma do tego Regexp.escape
, więc możesz powiedzieć Regexp.new("foo" + Regexp.escape(@thing.name) + "bar")
. Ale z twojego sprzeciwu wobec include
, brzmi to tak, jakbyś chciał, żeby odpowiedź zawierała tylko imię, prawda? W takim przypadku nie potrzebujesz w ogóle żadnego wyrażenia regularnego.
W każdym razie problem nie dotyczy tego, co jest wokół nazwy, ale jak nazwa jest ukryta. Dlatego przed porównaniem powinieneś (1) zdekodować odpowiedź lub (2) zakodować ciąg faker. To naprawdę nie ma znaczenia, które. Oba są dość proste:
expect(CGI.unescapeHTML(response.body)).to eq @thing.name
lub
expect(response.body).to eq CGI.escapeHTML(@thing.name)
Naturalnie, jeśli odpowiedź jest JSON, należy wymienić te wszystkie rzeczy HTML ucieczki z JSON, itp
Jestem ciekawy, dlaczego uważasz, że moja odpowiedź nie była wystarczająca. Czy mogę coś wyjaśnić? –
Problem z włączeniem jest taki, że jeśli "zawiera" go, chcę, aby pasował do niego całkowicie, a nie tylko, że słowo "istnieje" w nazwie. Chociaż mogę go używać jako zabezpieczenia, w którym źle zaznacz swoją odpowiedź poprawną :). Naprawdę staram się po prostu szukać innych możliwości. – msmith1114