接下來到鐵人賽結束會跟大家分享的內容皆來自於以下這兩本書:
但我以第一本的範例為主(個人偏好Manning的書),筆者以1個Microblog為例,介紹從無到有,基本上我也是邊看邊學,故說老實話,我會follow書裡面的步驟一步一步來,我也是變數名稱改一改,網頁layout/圖面,參加IT鐵人賽主要對我來說是學習Grails如何快速開發一個網站。
昨天忘記一提,所有相關Grails的設定黨都在conf目錄底下,而不難發現,其實Grails底層也是納入Spring以及Hibernate知名的java framework,Grails利用Groovy Dynamic features幫我們作好很多coding以及complied into bytecode的動作,更讓人感到欣慰的是沒有出現spring或是Hibernate等的XML組態設定檔,全部都是用Groovy包起來了
今天介紹如何建立Domain Class以及簡單的Integration Test
在建立Domain class之前要先討論一個話題就是型別(type and untyped),雖然Groovy屬dynamic language,並無強調一定要宣告型別,但對於Domain class來,各個屬性最好是指定型別以便未來作GORM(Groovy ORM),除非該屬性不須persist到資料庫裡可以用def宣告,一般而言需persist到database的屬性需宣告型別,以下是第一個Domain class,在GGTS上新增->Domin Class
package com.JasonMicroBlog
class User {
String userId //每個屬性最好宣告欄位
String password
String personalPage
Date dateCreated
static constraints = {
//各欄位的限制條件,用來作Validation
userId blank :false, unique:true //不允許空白且唯一
password size: 6..8 //密碼介於6到8個字元
personalPage url: true //必須是網址
}
}
Domain class說穿了就是GroovyBean而已...簡潔版的JavaBean....
再來書中示範在還沒有設定database相關設定前,筆者推薦用Integration Test測試我們寫的code是否work
關於Integration Test筆者推薦Spock framework來協助而非使用Grails內建的(應該是)JUnit吧?
首先我們需要把安裝spock plugin
先到conf目錄底下->打開BuildConfig.groovy檔案,此檔案是用來管理Dependency以及plugin的
請找到dendencies將spock的名稱打入,如下
dependencies {
// specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes e.g.
test "org.spockframework:spock-grails-support:0.7-groovy-2.0"
// runtime 'mysql:mysql-connector-java:5.1.22'
}
再到plugins下,因為spock屬test function,插入以下code
test(":spock:0.7") {
exclude "spock-grails-support"}
再來,請在該檔案上按右鍵->Grails Tools->Refresh Dependencies,如下圖
GGTS則會開始下載以及build spock dependeny
這些都完成後,接下來新增一Integration Test模擬
每一個void方法都代表一個測試unit,名稱可自取
1.第一個測試unit-"Saving our First user to the database"
void "Saving our First user to the database"() { //測試unit
given: 'A New Registered User'
//測試名稱
def jason= new User(userId:'Jason', password:'JasonGoo',
personalPage:'https://www.facebook.com/NeverFigureOut')
when: "the user is saved" //執行什麼樣的測試
jason.save()
then: 'it persisted to database successfully!'
//預期測試結果,撰寫code測試是否通過測試
jason.errors.errorCount ==0 //有沒有錯誤
User.get(jason.id).userId ==jason.userId
//檢查新增的使用者是否等於前面宣告的使用者
}
2.檢查欄位
void "Validating User Input"(){
given: 'Validate Columns'
def user =new User(userId:'Jason', passward:'X79',
personalPage:'I do not have homepage')
when:
user.validate()//執行檢查欄位
then:
user.hasErrors()//如果有errors的話
"unique"==user.errors.getFieldError("userId")
//每個限制條件都有對應之ErrorMessage,詳細需查API
"size.toosmall"==user.errors.getFieldError("passward")
"url.invaild"==user.errors.getFieldError("personalPage")
}
完成後,run app-test
執行結果:
結果在第二項欄位測試時fail了,還可以點選report來看
簡單說就是密碼太短了,與Domain Class的欄位限制衝突,測試沒過,需要修正
另外整個Integration Test Code還有兩個方法def setup(), def Cleanup()目前沒用到,若有介紹再行分享
明天繼續介紹如何實現1對1、1對多及多對多在Grails如何實現