テストコード書きました

今日は一日中RailsRSpecを使って結合テストコードの学習を進めていました。覚える量、記述する量ともに膨大で、なかなかボリュームのある学習内容だったと思います。本番のプログラミングでエラー出さない以前に、このテストコードでエラー出さないようにしないといけませんね^^;

以下、私が今日学習したメソッド等を書き出してみました。

 

①Visit

Visit (パス名)と記述することで、任意のパスに飛ぶためのメソッドです。

テストに直接使うメソッドではないですが、テストの開催場所に行くためのチケットといったところでしょうか。大抵最初に使います。

パス名ってどこで確認すればいいんだろって思ったんですが、ターミナルでrails routesかけると出てくるルーティングのPrefixがそれなんですね。でも、GETメソッドの中から該当のアクションを目を皿のようにして探し出すのって、なんとなくプログラミングっぽくないというか、もっと楽して探したいなと思ってます。いいやり方あるのかな。

 

②have

想定通りの動作をするのかを確認する「エクスペクテーション」という構文で使います。haveは何を確認するのかというと「存在」です。ちなみにこの「何を」を指定する記述を「マッチャ」と呼びます。だからhaveもマッチャです。

haveの右にアンダーバーを引き、もう一個ワードを付け足して、「何の」存在かを指定します。具体例を挙げると

 

・have_content => テキストの存在

・have_selector => フォームやボタンといった「セレクタ」の存在

・have_link => リンクの存在

 

等等。記述方法は

expect('[存在する場所等]').to have_●●('[存在するものの名前]')

場所以外に動作も指定できます。(指定の場所をクリックすれば存在するとか、ポインタを合わせれば存在するとか)

haveと●●の間にnoを記述して[have_no_●●]とすることで、「存在しないこと」を確認できます。

 

③fill_in

フォームに記述をするメソッドです。visit同様にテストのための予備動作ですね。

fill_in '(記述する場所)', with: (何を記述するか)

と記述します。記述する場所の名前はF12を押すと出てくる検証ツールで探し出します。

心憎いのが'(記述する場所)'の右下に設置されているカンマ(,)。これ忘れて20回くらいエラー出しました。

 

④find

これも同じく予備動作で、行動を指定してコンピューターを動かします。

find('場所').click

と記述すれば指定した場所をクリックしてくれるし、

find('場所').hover

と記述すれば指定した場所にポインタを合わせてくれます。

 

⑤change

haveと同じくマッチャの一つです。こちらは「変動したこと」を確認します。

expect{'変動する場所等'}.to change { '変動するものの名前' }.by(変動する数)

と記述します。場所や名前の指定について、haveが()で囲むのに対してchengeは{}で囲むのが特徴的です。また変動する場所等のところにfind記述をぶち込んで「このボタンをクリックすると1変動する」かどうかの確認もできます。findも()使う構文なので、左側が()だらけになります。で、「'」を一個つけ忘れたりしてエラーが起きます。

そして極め付けがchange { '変動する物の名前' }。「{」の両サイドと「}」の左サイドは半角スペース一個入ります。詰めるとエラーになります。{'変動する場所等'}は詰めてもエラーにならなかったのに。変なの。

 

話は横道にそれますが、私コードが上手くかけてるかどうかの検証のため、VSCに直接書き込まず、コンソールで一個一個検証しながらVSCにコピペしてたんですが、時々横着して、5,6個まとめて検証して一気にVSCに持って行ったりとかしてました。で、そのやり方で

expect{'変動する場所等'}.to change { '変動するものの名前' }.by(変動する数)

を打ち込むと、記述は正しい筈なのにエラーになっちゃうんですよね。で、一回コンソール終わらせて再起動して打ち込むとエラーにならないんです。もちろん、最初から1回ずつやってもエラーにならない。

(変動する数)は1でやってたんですが、確認した結果は0だったみたいなので、コンソールでのテスト中に { '変動するものの名前' }の中に何か違う値が入っちゃって、それで今回記述した{ '変動するものの名前' }を認識してくれなかったんじゃないか、それでコンソール閉じたら{ '変動するものの名前' }の値がリセットされて、再起動した時点で認識してくれるようになったんじゃないかと思ってるんですが…

う〜、頭がくるくるぱーしてきた〜、でも気になる〜