woshidan's blog

あいとゆうきとITと、とっておきの話。

Ruby on Railsのチュートリアル7(少しrspec(capybara使用)のテストを読んでいる)

ぜったいしばらく離れたら細かいこと忘れていく自信があるから遺言として書いている部分があるので気にしすぎず余裕があれば張り切ってまとめる方針で。

(これ書くよりコード書いた方がよくね?)

 

capybaraを使ってrspecのテストを書く

どこかにバグを書いちゃったというよりテストが全然よめなさすぎて進められない

ということがわかったので、ちょっと進む前に勉強してました。

曖昧になってない部分を少しだけメモ。

 

モデルに新しい属性を追加した

it { should respond_to(:attribute) }

とりあえず反応するか+制約条件について。

 

新しいビューを作った

visit target_path
it { should have_title(’title')}
it { should have_content(‘content’)}

タイトルや見出しがあるか確認する。

 

テストのために決まったデータを用意したい

FactoryGirlsの利用。FactoryGirlsはユーザのデータをspec/factories.rbに書いておいて、

テストを書いているrbファイルで

FactoryGirls.create(:user)

と書けば、書いたデータが一行で生成されてくれるというもの。

:userはfactories.rbでfactoryブロックで属性の値を設定したオブジェクトの名前のよう。

まちがったパスワードの入力などをチェックしたい場合など個別にデータを設定したい場合は、二番目以降の引数に設定することで可能。

Fakerと組み合わせることでそれっぽいユーザの情報を大量に生成することも可能。

 

Gemfile

gem 'factory_girl_rails', '4.2.1'

 

xxxx_spec.rb


let(:user) { FactoryGitl.create(:user) }

let(:xxx)はそのブロック内で変数を設定したいときに使う

 

個別に指定したい属性がある場合

let(:wrong_user) { FactoryGirl.create(:user, email: "wrong@example.com") }

上のように書きしたい属性と上書きする値を書き足す。 

 

factories.rbにデータの設定

factories.rb

FactoryGirl.define do
    factory :user do
		name "Mr.Example"
        email "example@mail.com"
		password "foobar"
		password_confirmation "foobar"
	end
end

 emailのインデントは<pre><code></code></pre>ではさんだら

レイアウトが崩れただけで意味はとくに無い。

 

あとは、

  • visitがroutes.rbに書いて指定した名前付きルートへコントローラの命令を受けながら正式にリンクを飛んでいく命令のに対し、getやpostなどメソッドとurlを指定して飛ぶのはもう少し低レイヤーへ命令を投げることができて、webサイトというよりサーバ自体の応答を試すことができる
  • patchなどはHTTPリクエストにない命令は、内部の処理としてはhiddenタグを使って偽装している

という話が面白かった。PATCHとかDELETEとかないよ、そんなの!って結構前から思っていたのですっきりした。

 

あとは、チュートリアルらしく、

ユーザからの変更を許可しない属性であることを試すために、

その属性の値を変更した後、アップデート用のパスへ飛ばしたり、

とかのお作法を眺めている感じです。

 

追記:属性を追加したり、属性の値の制約条件はsepc/modelsに追加されるモデルについてのテストに書く。属性の値の制約条件を見ると言えば、フォームの入力制限だから入力フォームのテストに書く、わけではない。フォームのページのテストには、フォームに不正な値を入れて記録ボタンを押したとき、モデルのオブジェクトを記録しようとして属性の値を検査したら不正な値だったからfalseがかえってきたっていう、「フォームに不正な値を入れ」て「記録ボタンを押した」ら「falseが返ってきた」の部分を書くらしい。 いかにも混ぜそう。

@userって書かれているのはなんなんだろうな、と思ったらit { should have_...}のitで指定されたオブジェクトのことみたい。