Grailsでdomainのテストを行う

ScaffoldしたBookのテストを行ってみようと思ったので、とりあえずdomainのテストを書いてみました。テストの方法は、Grailsのドキュメントとqiitaの記事を参考にしました。

参考ページ:

前回で

grails create-domain-class example.Book

を行っていたので、自動的にsrc/test/groovy/example/BookSpec.groovyができているはずです。自動で作られたテストは絶対に落ちるように作られているので、とりあえず実行してみましょう。

grails test-app example.BookSpec

Tests FAILEDと言われました。ここからがスタートです。

domainのテストでなにをテストするのか?

まだちゃんと勉強していませんが、ビジネスロジックはおそらくServiceで実装するのかなと思うので、domainのテストは制約(Constraints)のテストかなと思います。バリデーションのテストはValidatableTraitを使っている場合にはそちらをやるっぽい?(汎用的なバリデーションを使い回すときとか)

一気にやるのは私は苦手なので、範囲を細かく、まずdomainだけやります。

おさらい。Book Domainの定義について

Book Domainですが、以下のように定義していました。

package example

class Book {

    String title
    String content
    Integer price
    Date published

    static constraints = {
        title       blank: false,   nullable: false, size: 1..10
        content     blank: true,    nullable: true
        price       blank: true,    nullable: true
        published   blank: true,    nullable: true
    }
}

Book Domainのテストを定義する

Book Domainでのテスト項目は、

  • タイトルが必須であること
  • タイトルが10文字以内であればOK
  • タイトルが11文字以上であればNG

ということくらいですね。

ということで、参考サイトを元にとりあえずこんな感じで書いてみました。

package example

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

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

    def setup() {
    }

    def cleanup() {
    }

    void "データの検証を行う"() {
        when: 'タイトルがない場合'
        def book = new Book()

        then: '検証が失敗すること'
        !book.validate()

        when: 'タイトルがある場合'
        book = new Book(title: '楽しいGroovy')

        then: '検証が成功すること'
        book.validate()

        when: 'タイトルが11文字以上の場合'
        book.title = "a" * 11

        then: '検証が失敗すること'
        !book.validate()

        when: 'タイトルが10文字以内の場合'
        book.title = "a" * 10

        then: '検証が成功すること'
        book.validate()
    }
}

テストを実行する

では実行してみましょう。

grails test-app example.BookSpec

そうすると、以下のような結果になりました。

:compileJava UP-TO-DATE
> Building 11% > :compileGroovy > Resolving dependencies ':compile' > Resolving dependencies 'detachedConfiguration:compileGroovy UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava UP-TO-DATE
> Building 55% > :compileTestGroovy > Resolving dependencies ':testCompile' > Resolving dependencies 'detachedConfi:compileTestGroovy
:processTestResources UP-TO-DATE
:testClasses
:test

BUILD SUCCESSFUL

| Tests PASSED

成功した模様です。

まとめ

とりあえずテストのとっかかりを覚えておくと、テストを書くことへの面倒臭さを抑えることができるかなと思います。ドメインのテストは短くてすみそうなのでチャチャっとやってみましょう。


カテゴリー Grails, groovy | タグ | パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です