# WebUnit Tips

## Table of Contents

1. ベースとなるURLを決める
2. レスポンスを受け取る
3. HtmlElem
4. フォームのテスト
5. テーブルのテスト
6. リダイレクト
7. パラメータの数
A. 省略形

# 1. ベースとなるURLを決める

テストはどこのマシンでも動作することができるように、 例えば、テストしようとするアプリケーションのURLが http://kona.xxx.jp/~yuichi/tmp/test/ の下にあるならば、このURLを環境変数URLBASEへ設定する。 テストケースの中では @urlbase として参照する。

# 2. レスポンスを受け取る

      url = @urlbase + 'xxx/xxxx.html'
      response = Response::get( url )

# 3. HtmlElem

tree に含めたくない場合は WebUnit::Parser::ignore で不要なタグを 指定しておくことが可能。

# 4. フォームのテスト

## テスト対象

      <form action="xxxx" method="POST">
        <input type="text" name="login" value="x">
      <form>

## テスト準備

      response = Response::get( url )
      form = response.form
      parameters = form.parameters

## 4.1. テキストフィールドなどのテスト

テキストフィールドなど(hiddenやpassword)は以下のようにして、 それぞれの属性の値を取得することができる。 (1)から(4)は等価であるので、テスト仕様として見やすいものを採用する。

      assert_input( 'login', 'text', 'x', parameters[0] )    # ---(1)

      spec = { 'name'=>'user', 'type'=>'text', 'value'='x' } # ---(2)
      assert_attrs( spec, parameters[0] )                    # ---(2)

      assert_equals( 'login', parameters[0].name )           # ---(3)
      assert_equals( 'text', parameters[0].type )            # ---(3)
      assert_equals( 'x', parameters[0].value )              # ---(3)

      assert_equals( 'login', parameters[0].attrs['name'] )  # ---(4)
      assert_equals( 'text', parameters[0].attrs['type'] )   # ---(4)
      assert_equals( 'x', parameters[0].attrs['value'] )     # ---(4)

# 5. テーブルのテスト

## テスト対象

      <table>
        <tr bgcolor='white'>
          <td>EU/td
          <td><a href='sjis.html'>SJI/a</td>
        </tr>
        <tr bgcolor='red'>
          <td><a href='jis.html'>JI/a</td>
          <td>UTF-8</td>
        </tr>
      </table>

## テスト準備

      response = Response::get( url )
      table = response.tables[0]

## 5.1. テーブルセルのテスト

単純な文字列をテストする場合、 以下の２つの方法で記述できる。

     a. assert_equals( "EUC", table.at(1,1).data )
     b. assert_include( "EUC", table.at(1,1) )

リンクが設定されている文字列をテストしたい場合は リンク自体のdataをテストする必要がある。 このため、c.はfailするので、d. か e. の形式で記述する必要がある。 e. の記述を行うとその他のタグで囲まれていても成功する。

     c. assert_equals( "SJIS", table.at(1,2).data )
     d. assert_equals( "SJIS", table.at(1,2).find("a").data )
     e. assert_include( "SJIS", table.at(1,2) )

また、特定の HtmlElem が特定のセルに含まれている必要がある場合、 f. のように記述することができる。

     f. assert( table.at(2,1).has?( response.links[1] ) )

## 5.2. テーブルローのテスト

ローの属性をテストする。

     a. assert_equals( 'red', table.at(2).attrs['bgcolor'] )

ローに含まれるデータをテストする

     b. assert_include( "SJIS", table.at(1) )

# 6. リダイレクト

## 6.1. HTTPリダイレクト

レスポンスがHTTPリダイレクトだと分かっている場合は以下のように記述する ことができる。HTTPリダイレクト(コード:302)でない場合は、例外が発生する。

    response = Response::get( url ).redirect

## 6.2. JavaScriptによるリダイレクト(open)

    response = Response::get( url ).open.read
    response = Response::get( url ).opens[0].read

# 7. パラメータの数

      Form#params.size => Hash
      Form#parameters.size => Array

      Form#params.size => ユニークな名前を持つParamの数
      Form#parameters.size => Paramの数
      name属性に同じものが無ければ、この二つは同じ値となる。

# A. 省略形

      Response#form → Response#forms[0]
      Response#link → Response#links[0]
      Response#open → Response#opens[0]
      Response#table → Response#tables[0]
      Response#frame → Response#frames[0]
      Response#params → Response#forms[0].params