2014-06-13 33 views
5

Groovy ve Grails’de yeniyim. Boş bir dize boş değere dönüştürülen nedeniyle sınamak için etki alanı nesnesi için Spock testi başarısız olur. İşte kod. alan nesne grails test-app sonucu neden boş dizeler, Grails 2.4.0'daki alan nesnesinin yapıcısına geçerek null değerine dönüştürülür?

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

I new Todo(name: 't2', createdDate: new Date(), priority: '', status: 'ok') tarafından null dönüştürülür doğrultusunda boş dizge '' bulunan bir

@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 
    } 

} 

class Todo { 

    String name 
    Date createdDate 
    String priority 
    String status 

    static constraints = { 
     priority blank: true 
    } 

} 

Spock özellikleri, ayıklama. Bir süre sonra, Grails'de boş dizeleri web formundan null'a dönüştürmek için null olan bir özellik olduğunu görüyorum. Bu, Config.groovy'de grails.databinding.convertEmptyStringsToNull = false yapılandırmasıyla devre dışı bırakılabilir. Ama bunun Spock UT için geçerli olduğunu sanmıyorum. Denedim ama düşündüğüm gibi çalışmıyor.

Boş dizenin neden kurucuya gönderilen bir parametre olarak null değerine dönüştürüldüğünü merak ediyordum? Şimdiden teşekkürler.

cevap

6

Şu an biraz zirzopça, ama oldukça kolay çalışmak için yapılabilir: Eğer dize boş dönüştürülmesini istemiyorsanız, bu deneyin. Aşağıdaki test ... Grails 2.3.9 ile geçer

bir alan sınıfı:

// 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 

// ... 

bir birim testi:

// 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 == '' 
    } 
} 

Anahtar, bir denetleyiciyi gerçekten sınamadığı halde, ContollerUnitTestMixin'i uygulama örneğine uygular. Bakınız https://jira.grails.org/browse/GRAILS-11136.

Umarım bu yardımcı olur.

+0

Evet, sınama '@TestMixin (grails.test.mixin.web.ControllerUnitTestMixin) 'ekledikten sonra geçer. – user3737977

+0

Bu sadece benim için çok büyük bir problemi çözdü, bu konuda çok etkilendim, bu kadar çok yapılandırma ve garip varsayılan davranış! neyse teşekkürler! – soheildb

+0

@soheildb "bu konuda çok fazla yapılandırma ve garip varsayılan davranış" - Daha iyi varsayılan davranış için önerileriniz varsa, lütfen https://github.com/grails/grails-core/issues adresinden bir istek gönderin ve biz de bir göz atacağız . –

0

Boş dizelerin null değerine dönüştürülmesi, Grails databinding öğesinin bir özelliğidir, bu nedenle, veritabanlarının kullanıldığı her yerde bu gerçekleşir. Böyle bir yer, bir harita argümanına sahip bir alan sınıfının kurucusunu çağırmaktır.

new Todo().priority = ''