2014-09-16 11 views
5

Ho un sito reattivo e vorrebbe separare le preoccupazioni di se parti del mio modello di pagina sono crollati dal contenuto principale per pagina:pagine Composizione Geb con Groovy tratti

trait DesktopPage { 
    static content = { 
     header { $('nav', id:'nav-container') } 
    } 
} 

trait MobilePage { 
    // other stuff 
} 

trait HomePage { 
    static url = '' 
    static at = { title == 'My Site' } 
} 

class DesktopHomePage extends Page implements DesktopPage, HomePage {} 

Tuttavia, il Geb runtime non sembra raccogliere i blocchi di descrizione static fuori dai tratti, agendo invece come se non fossero presenti.

È possibile comporre problemi come questo utilizzando implicitamente tratti con Geb? In caso contrario, esiste una sintassi che mi consentirà di inserire le informazioni dai tratti implementati? HomePage.at non risolve.

+0

Cosa succede se si rimuove il 'statico' nei tratti? – Will

+0

@WillP Non funziona con l'idioma Geb. Ha un DSL idiosincratico per quei pezzi ispirati a Grails. – chrylis

+0

Per curiosità: il comportamento cambia in qualche modo se si dichiarano tali tratti come interfacce? – Will

risposta

1

Se si osserva lo documentation on traits and static fields si noterà che menziona esplicitamente che il missaggio in un tratto che dichiara un campo statico non aggiunge il campo alla classe. Geb è stato creato molto prima che i tratti fossero aggiunti a Groovy, quindi il loro utilizzo per comporre la pagina non era sicuramente preso in considerazione durante la progettazione dell'API.

Se l'URL e il correttore sono uguali per entrambe le pagine e solo il contenuto differisce tra la versione mobile e quella desktop, perché non si utilizza semplicemente l'ereditarietà?

class HomePage { 
    static url = '' 
    static at = { title == 'My Site' } 
} 

class DesktopHomePage extends HomePage { 
    static content = {...} 
} 

class MobileHomePage extends HomePage { 
    static content = {...} 
}