TIPS-ja.rd

# WebUnit Tips

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

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

テストケースの中では @urlbase として参照する。

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

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

## HtmlElem

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

## フォームのテスト

### テスト対象

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

### テスト準備

    !block example
    response = Response::get( url )
    form = response.form
    parameters = form.parameters
    !endblock

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

テキストフィールドなど(hiddenやpassword)は以下のようにして、 それぞれの属性の値を取得することができる。

1. から(4)は等価であるので、テスト仕様として見やすいものを採用する。

    !block example
    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)
    !endblock

## テーブルのテスト

### テスト対象

    !block example
    <table>
      <tr bgcolor='white'>
        <td>EUC</td>
        <td><a href='sjis.html'>SJIS</a></td>
      </tr>
      <tr bgcolor='red'>
        <td><a href='jis.html'>JIS</a></td>
        <td>UTF-8</td>
      </tr>
    </table>
    !endblock

### テスト準備

    !block example
    response = Response::get( url )
    table = response.tables[0]
    !endblock

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

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

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

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

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

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

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

### テーブル行のテスト

行の属性をテストする。

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

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

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

## リダイレクト

### HTTPリダイレクト

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

    response = Response::get( url ).redirect

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

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

## パラメータの数

Form#params

  これは Hash。ユニークな名前を持つ Param。

Form#parameters

  これは Array。Paramの数。

name属性に同じものが無ければ、この二つは同じ値となる。

## 省略形

- 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