2017-06-01 9 views
0

私は、ユーザーが画像を添付して投稿を作成できるフォームがあるとします。避けるべきであるカピバラで画像がアップロードされたことをアサートする方法は?

visit url 
fill_in the_form 
click_on 'Create' 
assert_selector '.post' 
post = Post.first 
img = page.find '.post .image' 
assert_equal post.file.thumb.url, URI(img[:src]).path 

しかし、私は、システムテストでデータベースオブジェクトに対してアサート聞いています:私は、添付画像は、次のページに表示されていることを確認します。私は何をしますか?

+0

'fill_in the_form'中にイメージ名を入力しますか?その名前のイメージが存在する(またはデータベースの名前を変更する)というアサーションを書くことができますか? –

+0

うん、私は 'fill_in the_form'段階の間にフォームに画像を添付します。そして、一般に、画像がアップロードされた後にファイル名が変更されることがあります。しかし、まあ、それはおそらく行います。あなたのコメントを答えに変えてください。 –

答えて

1

フォームを取り込むときに、長いバックエンドで起こってない「複雑な」ファイル名変更がありませんよう、すでにアップロードされたファイル名を知っている:

fill_in the_form 

したがって、あなたはページがこれでイメージが含まれていることを主張することができ名前(おそらくxpathを使用します)。

スペースがハイフンで置き換えられている場合は、理想的には変更されないファイル名を選択するか、テストで名前を再現することができます。

+1

@ x-yuriこれは100%正確です。そして、結果をassert_equal( 'post.image [src = "expected source"]) 'または' assert_selector( ' '.post .image'){| img | img [:src] =〜/ regex for expected path /} 'またはフィルタブロックで何を比較する必要があるかを指定します。このようにして、一致する要素のチェックはすべて、assert_selectorの内部で発生し、ページを動的に更新している場合は、待機/再試行し、不安定なテストを防ぎます。 –

+0

この1ビットで詳しく説明できますか? 'img = page.find '.post .image';を実行するのは安全ではないと言っていますか? assert_equal post.file.thumb.url、URI(img [:src])。パス '?私が理解しているように、 'find'はイメージがページに現れるのを待ちます。その後、私はその属性に対して安全に宣言できますか? –

+0

@ x-yuriページ上に '.post .image'要素が1つしかなく、一度表示されると属性が変更されないとすれば、それは安全です。しかし、find/assertにフィルタリングを含めることで、倍数がある場合、および/または一時的な 'src'属性を持つ要素にページが追加された場合に、特定の '.post .image'要素をチェックするケースを処理できますそれから、ajaxリクエストが返ったときに正しいものに更新されます。 –

関連する問題