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
成功した模様です。
まとめ
とりあえずテストのとっかかりを覚えておくと、テストを書くことへの面倒臭さを抑えることができるかなと思います。ドメインのテストは短くてすみそうなのでチャチャっとやってみましょう。
