2014-06-13 2 views
5

Ich bin neu in Groovy und Grails. Der Spock-Test für das Domänenobjekt, das getestet werden soll, schlägt fehl, da die leere Zeichenfolge in null konvertiert wird. Hier ist der Code. das Domänenobjekt,Warum werden leere Zeichenfolgen in null konvertiert, die in Grails 2.4.0 an den Konstruktor des Domänenobjekts übergeben werden?

class Todo { 

    String name 
    Date createdDate 
    String priority 
    String status 

    static constraints = { 
     priority blank: true 
    } 

} 

Die Spock Spezifikation

@TestFor(Todo) 
class TodoSpec extends Specification { 

    void "test persist"() { 
     when: 
     new Todo(name: 't1', createdDate: new Date(), priority: "1", status: 'ok').save() 
     new Todo(name: 't2', createdDate: new Date(), priority: '', status: 'ok').save() 

     then: 
     Todo.list().size() == 2 
    } 

} 

Das Ergebnis grails test-app ist

Todo.list().size() == 2 
    |  |  | 
    |  1  false 
    [collab.todo.Todo : 1] 
     at collab.todo.TodoSpec.test persist(TodoSpec.groovy:18) 

I die leere Zeichenfolge '' in der Zeile gefunden new Todo(name: 't2', createdDate: new Date(), priority: '', status: 'ok') zu null umgewandelt wird durch Debuggen. Nach Google eine Weile, ich sehe, gibt es ein Feature in Grails Umwandlung der leeren Zeichenfolgen aus dem Web-Formular auf Null zu persistieren, die durch eine Konfiguration grails.databinding.convertEmptyStringsToNull = false in Config.groovy deaktiviert werden kann. Aber ich denke nicht, dass das bei Spock UT so ist. Ich habe es versucht, aber es funktioniert nicht, wie ich dachte.

Ich habe mich gefragt, warum die leere Zeichenfolge als ein Parameter an den Konstruktor übergeben wird, um Null? Danke im Voraus.

Antwort

6

Es ist ein wenig hinky gerade jetzt, aber kann gemacht werden, ziemlich leicht zu arbeiten. Der folgende Test geht mit Grails 2.3.9 ...

Ein Domain-Klasse:

// grails-app/domain/com/demo/Person.groovy 
package com.demo 

class Person { 
    String title 
} 

Config.groovy:

// grails-app/conf/Config.groovy 
grails.databinding.convertEmptyStringsToNull = false 

// ... 

Ein Unit-Test:

// test/unit/com/demo/PersonSpec.groovy 
package com.demo 

import grails.test.mixin.TestFor 
import spock.lang.Specification 

@TestFor(Person) 
@TestMixin(grails.test.mixin.web.ControllerUnitTestMixin) 
class PersonSpec extends Specification { 

    void "test empty string conversion"() { 
     when: 
     def p = new Person(title: '') 

     then: 
     p.title == '' 
    } 
} 

Die Der Schlüssel ist das Anwenden des ContollerUnitTestMixin auf den Testfall, obwohl er einen Controller nicht wirklich testet. Siehe https://jira.grails.org/browse/GRAILS-11136.

Ich hoffe, dass hilft.

+0

Ja, der Test besteht nach dem Hinzufügen von '@TestMixin (grails.test.mixin.web.ControllerUnitTestMixin)'. – user3737977

+0

das hat gerade ein riesiges problem für mich gelöst, nicht sonderlich beeindruckt von den grils auf dieser seite, so viel config und merkwürdiges default-verhalten auf diesem! trotzdem danke!! – soheildb

+0

@soheildb "so viel config und seltsames Standardverhalten auf diesem" - Wenn Sie Empfehlungen für ein besseres Standardverhalten haben, reichen Sie bitte eine Anfrage unter https://github.com/grails/grails-core/issues ein und wir werden einen Blick darauf werfen . –

0

Die Umwandlung von leeren Zeichenfolgen in null ist ein Merkmal der Grails-Datenbindung, also wird dies überall dort verwendet, wo Datenbindung verwendet wird. Ein solcher Ort ist der Aufruf des Konstruktors einer Domänenklasse mit einem Kartenargument. Wenn Sie nicht die Zeichenfolge wollen null konvertiert werden, versuchen Sie dies:

new Todo().priority = '' 
Verwandte Themen