2017-01-23 13 views
6

今、私は "Faker" Company Nameを使用して失敗している単体テストを持っています。アポストロフィ文字でRspecコントローラのテストに失敗しましたか?

expect(response.body).to match(@thing.name)はうんざりしているようです。

エラーを見ると、Faker Companyの名前には、「O'Brian Company」や「O'Hare Company」などのようなものがあることがあります。

fakerはエンコードされた文字列ですか?エンコードされた文字列を照合するのは良い考えではないことを知っているので、Factory IMに特定の会社名を指定するだけでは実際には使用したくありません。

ありがとうございました

+0

なぜ私の答えが十分でないように感じたのか不思議です。私が明確にできるものは何ですか? –

+0

インクルードの問題は、インクルードに「contains」が含まれていれば、その名前に「exists」という単語だけでなく、完全に一致させたいということです。私はフォールバックとしてそれを使用するかもしれませんが、あなたの答えを間違ってマークしてください:)。私は本当に他の可能性を探しています。 – msmith1114

答えて

5

Fakerはエンコードを行いません。それはちょうどあなたにO'Malleyのような文字列を与えるでしょう。しかし、レスポンスには、HTMLのエスケープ(または形式に応じていくつかの種類)が必要です(O'Malleyなど)。あなたは確かに確認するために常にputs response.bodyすることができます。

マッチャーは実際には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)フェイカー文字列をエンコードするかのいずれかを行う必要があります。それは本当に問題ではありません。どちらも、かなり簡単です:あなたの応答はJSONであれば

expect(CGI.unescapeHTML(response.body)).to eq @thing.name 

または

expect(response.body).to eq CGI.escapeHTML(@thing.name) 

もちろん、あなたが参照していると仮定するなど

+0

簡単な質問:あなたの "期待"機能にはこのCGIは何ですか?それはそれらをエンコードするものですか? – msmith1114

+0

CGIはRuby標準ライブラリの一部です:https://ruby-doc.org/stdlib-2.3.0/libdoc/cgi/rdoc/CGI.html –

3

#matchを使用する代わりに#includeを使用してみてください。

expect(response.body).to include(@thing.name) 
2

あなたは、文字列の代わりに正規表現を渡してみてください:

また
expect(response.body).to match(Regexp.new(@thing.name)) 

、問題はあなたが偽物から名前のこのタイプを取得した場合にのみ、あなたはこれを見てみる必要がある場合にはQA、それはいくつかの良い洞察を与える。

+0

私はそれを使用しないという問題は、サンプルのテストデータをたくさん定義する必要があるかと思います。しかし、奇妙な値の問題を表示するなどの点では良い方法です。 – msmith1114

2

JSONでものをエスケープすべてこのHTMLを、交換する必要がありますFaker::CompanyFaker gem

あなたの期待しているパスを作成する正しい方法は、Regexp例の@rafael-costaのように。そうすることで、アポストロフィのようなものから脱出する。

Fakerを使用する際の問題は、テストが確定的でないことです。テストのための静的な既知の入力を提供し、出力がそれらの入力に基づいて特定の期待値をパスすることを期待するのがベストプラクティスです。

company = Company.new(name: 'Acme Anvils') 
get :show, params: {id: company.to_param}, session: {} 
expect(response.body).to match(Regexp.new('Acme Anvils', Regexp::MULTILINE)) 

また、あなたは通常、あなたのコントローラの仕様内の特定の身体の出力をテストするべきではない:より多くの情報が、おそらくこのような何かせずに適切な例を提供することは困難です。これを行うには、さまざまな目的でテストを行います。あなたは通常write a view testでしょう。

関連する問題