2011-08-05 4 views
4

J'écris un test unitaire pour quelques méthodes simples. Le problème que je rencontre est que 'save' ne fonctionne pas pour mon objet domain même si le domaine doit être mocké. Lors de l'appel de validate sur l'objet de domaine, il revient comme vrai. J'ai même entouré l'objet avec try/catch pour m'assurer qu'il ne lançait pas d'erreurs bizarres et ce n'est pas le cas. Code ci-dessous pour l'appel et le test.Grails mockDomain save not save

void test() 
{ 
    mockDomain(MyDomain) 
    Map map1= ["asdf":" "] 
    Map map2 = ["asdf":123] 
    InputObject input = new InputObject() 
      input.setForeignId("1") //not a constraint 
    input.setMap1(map1) 
    input.setMap2(map2) 
    service.methodUnderTest(profile) 
    List list = MyDomain.getAll() 
    assertEquals 1, l.size() //FAILS 
} 

def persistPublishGuids(InputObject input) 
{ 
    try{ 
    HashMap map1 = input.map1 
    for (e in map1) 
    { 
     String key= e.getKey() 
     String value = e.value 
     long size = input.map2.get(key) 
     MyDomain domain = new MyDomain (id:guid, field1:value, field2:input.foreignId, field3:size) 
     domain.save() 
    } 
    } catch(ex) 
    { 
     ex.printStackTrace() 
    } 
} 
+3

Il serait probablement utile si c'était un [sscce] (http://sscce.org/). Ce que vous avez posté ne peut pas être exécuté seul. Essayez de produire l'exemple le plus simple qui va exécuter et reproduire le problème et l'afficher. Il est possible que, ce faisant, vous découvrirez la racine du problème, et sinon, vous aurez un exemple beaucoup plus clair pour quelqu'un pour aider. – ig0774

+0

Je voudrais, mais je l'ai compris. Le nécessaire pour faire fonctionner les grails, puis nettoyer/reconstruire le projet dans STS. Je l'ai seulement découvert parce que quand j'ai commencé à écrire un autre test ce matin et qu'il a prétendu qu'il n'y avait pas de méthode 'save()' sur un de mes objets de domaine. Googling qui m'a conduit à la solution propre et reconstruire. – Joseph

Répondre

1

Le problème était que l'application Grails devait être nettoyée et le projet reconstruit.

+0

c'est la peste des grails ... Je passe plus de temps à nettoyer/compiler que coder des trucs ... GrrrRails. – Guillaume

+0

Je n'ai pas eu ce problème depuis longtemps. Vous devez avoir un problème d'installation. – Joseph

+0

Je parlais en général: les grails «propres» sont un peu les mêmes que les fenêtres redémarrent ... ça guérit presque tous les comportements étranges ... – Guillaume

4

Je vous recommande également de définir les indicateurs flush et failOnError sur true lors de l'enregistrement des objets de domaine dans les tests. 'flush: true' assure que l'objet est sauvegardé immédiatement. Sans erreurs de validation failOnError, l'objet n'est PAS enregistré et cela peut facilement être manqué.

domainObject.save(flush:true, failOnError: true) 

Il est également utile d'envisager la mise en drapeau validate false si vous ne voulez pas les données de base de configuration pour tous les champs dans le test

domainObject.save(validate: false)

Voir la Grails domain object save docs for full information