goo blog サービス終了のお知らせ 

ねこテニ

猫とテニス。

【アプリ】Rspecを書いてみる(featureのテスト2)

2015年09月07日 | プログラミング
よ・・・よし、これで最後だ。

もう一個作りたかったテストはTimelineの機能テスト。
Nekoteniがこのねこてちょうというアプリに優先度高めで欲しかった機能。

タグボタンを押すと、そのタグに紐付けされた投稿だけが表示される。

これ。

なのでこれのテストを作ります。

ストーリーはこんな感じ。
・トップページに行く。
 ↓
・ログインする。
 ↓
・ログイン後、timeline_pathに遷移するかどうか確認。
・すでに登録されているタグ1、タグ2の2つの投稿記事があるかどうかも確認。
 ↓
・メモ1&タグ1、メモ2&タグ2の組み合わせの投稿記事を作成。
・timeline_pathに遷移するかどうか確認。
 ↓
----ここまでcreate_memo_spec.rbを流用-----
 ↓
・タグリストのタグ1のボタンをクリックする。
 ↓
・タグ2がタイムライン上にないことを確認。
 ↓
・タグリストのタグ2のボタンをクリックする。
 ↓
・タグ1がタイムライン上にないことを確認。
 ↓
タグリストのすべてのボタンをクリックする。
 ↓
・timeline_pathに遷移するかどうか確認。
・タグ1とタグ2がタイムライン上にあることを確認。

ここで問題になるのが赤字のところ。
調べたいのはタイムライン上にタグ2がないことだけど、タグリストにはタグ2がある。
つまり、expect(page).not_to have_content('タグ2')は使えない。

というわけでgoogle先生の登場です。
今度はちゃんと検索ワードにcapybaraを入れる!!

あれこれ探して見つかったのがここ。

使えるRSpec入門・その4「どんなブラウザ操作も自由自在!逆引きCapybara大辞典」

素敵ー!しびれるー!!
んじゃ、早速探して行きましょう。

あるクラス内にあるテキストだけhave_contentしたいわけです。

これかな?
特定のタグやCSS要素に特定の文字列が表示されていることを検証する

それともこれかな?
画面上に複数現れる要素を絞り込む

んー、どっちでもできそうだけど、withinの方が楽そう。
楽な方にする。うん。

投稿記事が表示されてるクラスは「col-sm-8」なんだけど・・・。
うーん、これ、bootstrapの表示幅のクラスなのね。
これってさ、今はcol-sm-8は1つしかないからいいけど、例えばcol-sm-2が4つあったらどのcol-sm-2よ?!って絶対エラーが出るよね。
というわけで、このTIPSを使う。
Tips:テストしにくいviewはテストをしやすいように変更する
idかclassをつけておけば、どのcol-sm-8か悩まなくてすむし、テストするときにもわかりやすいよね。

というわけで、タグリストがある「.col-sm-4」は、「.col-sm-4.tag_list_container」に変更。
投稿記事が並んでる「.col-sm-8」は「.col-sm-8.main_content」に変更した。

で、結果こうなりました。
spec/features/timeline_spec.rb
require 'rails_helper'

describe 'メモを登録する' do
let(:user) { create(:user, password: 'password', password_confirmation: 'password') }
let!(:tag1) { create(:tag, user_id: user.id, tag: 'タグ1') }
let!(:tag2) { create(:tag, user_id: user.id, tag: 'タグ2') }

it do
# トップページに行く_
visit root_path

# ログインする
click_link 'ログインする'
fill_in 'email', with: user.email
fill_in 'password', with: 'password'
click_button 'ログイン'

# ログイン後、timeline_pathに遷移するかどうか
uri = URI.parse(current_url)
expect(uri.path).to eq timeline_path
expect(page).to have_content('タグ1')
expect(page).to have_content('タグ2')

# メモ投稿ページに遷移するかどうか
click_link 'メモを投稿する'
expect(page).to have_content('投稿する')

# 「メモ1」という内容のメモを作成する
fill_in 'text', with: 'メモ1'
check("tag_#{tag1.id}")
click_button '投稿する'

#puts page.body
# メモ作成後、timeline_pathに遷移して、「メモ1」&「タグ1」のメモが作られているかどうか
uri = URI.parse(current_url)
expect(uri.path).to eq timeline_path
expect(page).to have_content('メモ1')
expect(page).to have_content('タグ1')

# メモ投稿ページに遷移するかどうか
click_link 'メモを投稿する'
expect(page).to have_content('投稿する')

# 「メモ2」という内容のメモを作成する
fill_in 'text', with: 'メモ2'
check("tag_#{tag2.id}")
click_button '投稿する'

# メモ作成後、timeline_pathに遷移して、「メモ2」&「タグ2」のメモが作られているかどうか
uri = URI.parse(current_url)
expect(uri.path).to eq timeline_path
expect(page).to have_content('メモ2')
expect(page).to have_content('タグ2')

#


よいよしよーし!!

あ、文頭のlet!でタグを作る際に、factory_girl使ってみました!!
tag.rbファイルを作成して、こういう風に書いておいたっす。

spec/factories/tag.rb
FactoryGirl.define do
factory :tag do
end
end

中身は空なので、タグを作る際のuser_idとタグ名は指定しなくちゃいけないんですが、これでletでユーザーを作るのと同じ書式になるから、見やすいでしょ(^^)エヘヘ。
それだけなんだけどね・・・。

よし!これでテストは終了!!
コミットコミット!!

最新の画像もっと見る

コメントを投稿

サービス終了に伴い、10月1日にコメント投稿機能を終了させていただく予定です。