[Grails]ユニットテスト入門（taglib編）

#参考
[http://grails.jp/doc/latest/guide/testing.html](http://grails.jp/doc/latest/guide/testing.html)
[http://grails.org/doc/latest/guide/testing.html](http://grails.org/doc/latest/guide/testing.html)



# はじめに
今回はGrailsのバージョンが2.4です。
標準でSpockでテストを書きます。
テストを実行するためには、以下のコマンドを実行します。

`test-app` もしくは `test-app unit:`

コレで実行可能なユニットテストが実行されます。
他にもオプションなどありますが、基本的に気にしないほうがいいです。テストが実行されなかったりして、混乱のもとになります。

現在自分がGrailsのユニットテストの書き方を勉強中です。
この記事はまだ完成していません。
Qiitaの下書きが埋まってしまったので、とりあえずの公開となります。
今後、内容の修正、追記を都度行います。

#豆知識
ユニットテストなので、Grailsは環境を**test**として、DataSource.groovyとBootstrap.groovyを**ユニットテストが終わった後に**読み込ます。
コレは、ユニットテストを環境（データベース）に依存させないためです。
integrationテストが続いて実行される場合には、その情報が利用されます。

#テスト用ファイルの生成方法
`create-domain-class Test`とか`create-controller Test`コマンド、`create-tag-lib Test`を実行すると、それ用のユニットテスト用ファイルが自動で生成される。

デフォルトは以下のようなソースになっている。

```groovy:TestSpec.groovy
package パッケージ名

import grails.test.mixin.TestFor
import spock.lang.Specification

/**
 * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions
 */
@TestFor(Test)
class TestSpec extends Specification {

    def setup() {
    }

    def cleanup() {
    }

    void "test something"() {
    }
}
```

```groovy:TestControllerSpec.groovy
package パッケージ名

import grails.test.mixin.TestFor
import spock.lang.Specification

/**
 * See the API for {@link grails.test.mixin.web.ControllerUnitTestMixin} for usage instructions
 */
@TestFor(TestController)
class TestControllerSpec extends Specification {

    def setup() {
    }

    def cleanup() {
    }

    void "test something"() {
    }
}

```
#前提条件
テスト用のドメインはもう作っておいてね！


`create-tag-lib Test`




```groovy:TestTagLib.groovy
package パッケージ名

import grails.test.mixin.TestFor
import spock.lang.Specification

/**
 * See the API for {@link grails.test.mixin.web.GroovyPageUnitTestMixin} for usage instructions
 */
@TestFor(TestTagLib)
class TestTagLibSpec extends Specification {

    def setup() {
    }

    def cleanup() {
    }

    void "test something"() {
    }
}
```

そうすると以下のユニットテストも自動で生成されます。

```groovy:TestTagLib.groovy
package パッケージ名

class TestTagLib {
    static namespace = "s"

    def hello = { attrs, body ->
        out << "Hello ${attrs.name ?: 'World'}"
    }

    def bye = { attrs, body ->
        out << "Bye ${attrs.name ?: 'World'}"
    }
}
```

@TestForアノテーションにてテストしたいTagLibを指定する。
代わりに、@TestMixin(GroovyPageUnitTestMixin)でもOK.
この場合、複数のタグライブラリをテストできるようになるが、`tagLib`が使えなくなったりする。
その代わりなのか、assertOutputMatchesなどの専用メソッドが利用できるようになる。

```groovy:TestTagLibTestMixin.groovy
package パッケージ名

import grails.test.mixin.TestMixin
import grails.test.mixin.web.GroovyPageUnitTestMixin
import spock.lang.Specification

@TestMixin(GroovyPageUnitTestMixin)
class TestTagLibTestMixinSpec extends Specification{

    def setup() {
    }

    def cleanup() {
    }

    void "タグライブラリの基本的なテスト方法"() {
        setup:
        mockTagLib(TestTagLib)

        expect:
        applyTemplate('<s:hello />') == 'Hello World'
        applyTemplate('<s:hello name="koji" />') == 'Hello koji'
        applyTemplate('<s:bye author="${author}" />', [author: new Test(name:'koji')]) == 'Bye koji'

        // この形式に変化はなし
    }

    void "タグライブラリの基本的なテスト方法(2)" () {

        setup:
        mockTagLib(TestTagLib)

        expect:
        assertOutputEquals('Hello World', '<s:hello />')
        assertOutputMatches(/.*ji*./, '<s:hello name="koji"/>')
    }

}

```