2010-09-02 34 views
3

在下面的示例中(取自Book of Geb),我們正在單擊一個按鈕,將我們帶到另一頁面。使用geb&spock時在頁面之間傳遞狀態

class GoogleHomePage extends Page { 
    static url = "http://google.com" 
    static at = { 
     title == "Google" 
    } 
    static content = { 
     searchField { $("input[name=q]") } 
     searchButton(to: GoogleResultsPage) { $("input[value='Google Search']") } 
    } 
} 

Browser.drive(GoogleHomePage) { 
    searchField.value("Chuck Norris") 
    searchButton.click() 
    assert at(GoogleResultsPage) 
    assert resultLink(0).text() ==~ /Chuck/ 
} 

如何在轉到另一頁時通過狀態?例如,用戶已經選擇了這種語言,在下一頁中,我希望頁面可以使用該語言。一個更通用的例子:

import geb.* 
import grails.plugin.geb.GebSpec 

class GoogleHomePage extends Page { 
    static url = "http://google.com" 
    static at = { title == "Google" } 
    static content = { 
     searchField { $("input[name=q]") } 
     searchButton(to: GoogleResultsPage, searchTerm:searchField.value()) { $("input[value='Google Search']") } 
    } 
} 

class GoogleResultsPage extends Page { 

    def searchTerm 

    static at = { 
    title == "${searchTerm} - Google Search" 
    } 
} 

class MainFunctionalSpec extends GebSpec { 

def "Google search"() { 
    when: 
    to GoogleHomePage 

    then: 
    searchField.value("Chuck Norris") 
    searchButton.click() 
    assert at(GoogleResultsPage) 
} 
} 

此代碼有2個問題,我得到一個「沒有這樣的屬性:searchField類:GoogleHomePage」關於searchButton.click試圖填充SEARCHTERM時()。即使我對傳遞的內容進行了硬編碼,GoogleResultsPage.searchTerm也是null,並且at聲明失敗。有任何想法嗎?

+0

我可以在我的實際測試中檢查此狀態,但我寧願將此斷言保存在Page Model – Peter 2010-09-02 22:33:08

回答

3

這對於0.4而言並不可行。模板定義的映射選項成爲該模板的選項。更重要的是,內容模板是在靜態上下文中定義的,但是它們的閉包定義是在實例上下文中進行評估的。最終的結果是從這一點無法訪問實例狀態。

的解決方案是使用新的生命週期掛鉤在0.5:

http://bamboo.ci.codehaus.org/browse/GEB-MASTERDEFAULTS/latest/artifact/Manual/pages.html#lifecycle_hooks

class GoogleHomePage extends Page { 
    static url = "http://google.com" 
    static at = { title == "Google" } 
    static content = { 
     searchField { $("input[name=q]") } 
     searchButton(to: GoogleResultsPage, searchTerm:searchField.value()) { $("input[value='Google Search']") } 
    } 

    def onUnload(GoogleResultsPage nextPage) { 
     nextPage.searchTerm = searchField.value() 
    } 
} 

class GoogleResultsPage extends Page { 
    def searchTerm 
    static at = { 
     title == "${searchTerm} - Google Search" 
    } 
} 

這是從Codehaus的快照存儲庫下載最新的0.5-SNAPSHOT版本。

+0

完美 - 謝謝! – Peter 2010-09-09 04:36:49