2010-07-16 18 views
1

Je regarde un projet de jouet avec Grails, mais j'ai quelques problèmes concernant la base de données HSQLDB. Mon fichier DataSource.groovy est par défaut:Confusion avec Grails base de données de développement

environments { 
    development { 
     dataSource { 
      dbCreate = "create-drop" // one of 'create', 'create-drop','update' 
      url = "jdbc:hsqldb:mem:devDB" 
      loggingSql = true 
     } 
    } 
    test { 
     dataSource { 
      dbCreate = "update" 
      url = "jdbc:hsqldb:mem:testDb" 
      loggingSql = true 
     } 
    } 
    production { 
     dataSource { 
      dbCreate = "update" 
      url = "jdbc:hsqldb:file:prodDb;shutdown=true" 
     } 
    } 
} 

Et je suis en cours d'exécution d'un test simple:

class BookTests extends GrailsUnitTestCase { 
    protected void setUp() { 
     super.setUp() 

     mockDomain (Book) 
     def book = new Book ("The shinning","Some guy who wrote it") 
     if (book.save()){ 
      println ("YEAH") 
     } 
     else{ 
      print ("AWWWWHH") 
     } 
    } 

    protected void tearDown() { 
     super.tearDown() 
    } 

    void testSomething() { 
     def books = Book.getAll() 
     print (books.size()) 
    } 
} 

Après la book.save() dans la méthode setUp(), je reçois un "YEAH", mais le procédé testSomething(), le books.size() se révèle être 0.

1 classe de test trouvée dans le paquet 'test'

YEAH 0 Processus terminé avec le code de sortie

Suis-je sur quelque chose? J'avais l'impression que ce HSQLDB a été mis en place pour les tests de développement, mais j'ai eu des problèmes dans les deux environnements (soit avec ce test, soit avec une application très simple.)

Répondre

2

Utilisez book.save(flush: true) uniquement en appelant save() enregistre cet objet pour qu'il soit enregistré par Hibernate à un moment donné dans le futur - par exemple à la fin d'une transaction.

En savoir plus sur cette ici: http://grails.org/doc/latest/guide/single.html#5.3.1 Saving and Updating

Edit: j'ai trouvé le grails.test.MockUtils.groovy à mettre en œuvre de façon incorrecte pour getAll(). Il n'y a aucune implémentation qui gère correctement un appel sans paramètre. Vous pourriez surmonter cela avec une solution simple. Voir l'échantillon ci-joint:

package sandbox 

import grails.test.* 

class BookTests extends GrailsUnitTestCase { 

    protected void setUp() { 
    super.setUp() 
    // test data setup 
    def bookInstances = [ 
      new Book(title: "Grails", author: "Graeme"), 
      new Book(title: "Spring", author: "Rod") 
    ] 
    mockDomain Book, bookInstances 
    new Book(title: "The shinning", author: "Some guy who wrote it").save(flush: true) 

    // fixing parameterless getAll() behaviour through delegating to findAll() 
    registerMetaClass Book 
    Book.metaClass.'static'.getAll = {-> Book.findAll() } 
    } 

    protected void tearDown() { 
    super.tearDown() 
    } 

    void testSomething() { 
    assert Book.getAll().size() == 3 
    assert Book.findAll().size() == 3 
    } 

} 
1

Vous utilisez un test unitaire. Cela ne sauvera rien à la base de données. Vous vous moquez du domaine, donc Grails va faire quelques trucs pour faire croire que vous avez des méthodes de persistance disponibles, mais rien ne va à la base de données. Si vous le souhaitez, écrivez un test d'intégration. Donc, en réponse à votre question, vous n'avez aucun problème avec votre base de données. Vous éprouvez des difficultés à démarrer avec les tests unitaires.

Le conseil de flush par @codescape est bon aussi.