2012-02-12 49 views
1

有趣的是,这里是groovy和grails中的新功能。我试图运行grails install-templates,看到产生test.groovy它看起来像这样...如何在grails测试中填充有效的参数

`<%=packageName ? "package ${packageName}\n\n" : ''%> 

import org.junit.* 
import grails.test.mixin.* 

@TestFor(${className}Controller) 
@Mock(${className}) 
class ${className}ControllerTests { 


    def populateValidParams(params) { 
     assert params != null 
     // TODO: Populate valid properties like... 
     //params["name"] = 'someValidName' 
    } 

    void testIndex() { 
     controller.index() 
     assert "/$propertyName/list" == response.redirectedUrl 
    } 

    void testList() { 

     def model = controller.list() 

     assert model.${propertyName}InstanceList.size() == 0 
     assert model.${propertyName}InstanceTotal == 0 
    } 

    void testCreate() { 
     def model = controller.create() 

     assert model.${propertyName}Instance != null 
    } 

    void testSave() { 
     controller.save() 

     assert model.${propertyName}Instance != null 
     assert view == '/${propertyName}/create' 

     response.reset() 

     populateValidParams(params) 
     controller.save() 

     assert response.redirectedUrl == '/${propertyName}/show/1' 
     assert controller.flash.message != null 
     assert ${className}.count() == 1 
    } 

    void testShow() { 
     controller.show() 

     assert flash.message != null 
     assert response.redirectedUrl == '/${propertyName}/list' 


     populateValidParams(params) 
     def ${propertyName} = new ${className}(params) 

     assert ${propertyName}.save() != null 

     params.id = ${propertyName}.id 

     def model = controller.show() 

     assert model.${propertyName}Instance == ${propertyName} 
    } 

    void testEdit() { 
     controller.edit() 

     assert flash.message != null 
     assert response.redirectedUrl == '/${propertyName}/list' 


     populateValidParams(params) 
     def ${propertyName} = new ${className}(params) 

     assert ${propertyName}.save() != null 

     params.id = ${propertyName}.id 

     def model = controller.edit() 

     assert model.${propertyName}Instance == ${propertyName} 
    } 

    void testUpdate() { 
     controller.update() 

     assert flash.message != null 
     assert response.redirectedUrl == '/${propertyName}/list' 

     response.reset() 


     populateValidParams(params) 
     def ${propertyName} = new ${className}(params) 

     assert ${propertyName}.save() != null 

     // test invalid parameters in update 
     params.id = ${propertyName}.id 
     //TODO: add invalid values to params object 

     controller.update() 

     assert view == "/${propertyName}/edit" 
     assert model.${propertyName}Instance != null 

     ${propertyName}.clearErrors() 

     populateValidParams(params) 
     controller.update() 

     assert response.redirectedUrl == "/${propertyName}/show/\$${propertyName}.id" 
     assert flash.message != null 

     //test outdated version number 
     response.reset() 
     ${propertyName}.clearErrors() 

     populateValidParams(params) 
     params.id = ${propertyName}.id 
     params.version = -1 
     controller.update() 

     assert view == "/${propertyName}/edit" 
     assert model.${propertyName}Instance != null 
     assert model.${propertyName}Instance.errors.getFieldError('version') 
     assert flash.message != null 
    } 

    void testDelete() { 
     controller.delete() 
     assert flash.message != null 
     assert response.redirectedUrl == '/${propertyName}/list' 

     response.reset() 

     populateValidParams(params) 
     def ${propertyName} = new ${className}(params) 

     assert ${propertyName}.save() != null 
     assert ${className}.count() == 1 

     params.id = ${propertyName}.id 

     controller.delete() 

     assert ${className}.count() == 0 
     assert ${className}.get(${propertyName}.id) == null 
     assert response.redirectedUrl == '/${propertyName}/list' 
    } 
}` 

所以我把它复制到相应的控制器测试,并改变了所有的$ {propertyName的}和$ {}的className这样。 testIndex()testList()和testCreate()传递,但testSave(),testUpdate(),testDelete()和testEdit()失败。我想,我需要填写此部分:

def populateValidParams(params) { 
     assert params != null 
     // TODO: Populate valid properties like... 
     //params["name"] = 'someValidName' 
    } 

所以我没有和方法如下:

def populateValidParams(params) { 
    assert params != null 
    // TODO: Populate valid properties like... 
    //params["name"] = 'someValidName' 

    params["company"] = 'someCompany' 
    params["position"] = 'somePosition' 
    params["responsibilities"] = 'someResponsibility' 
    params["startDate"] = new Date ('2007/01/01') 
    params["endDate"] = new Date ('2010/01/01') 

} 

,但仍是测试失败..难道我做错了什么?我觉得我做错了与PARAMS ..我有点不熟悉那种常规型的.. 这是堆栈跟踪保存

junit.framework.AssertionFailedError: Assertion failed: 

assert response.redirectedUrl == '/employmentHistory/show/1' 
     |  |    | 
     |  null   false 
     org.codeh[email protected]737611 

    at com.someapp.controller.EmploymentHistoryControllerTests.testSave(EmploymentHistoryControllerTests.groovy:63) 

作秀:

junit.framework.AssertionFailedError: Assertion failed: 

assert employmentHistory.save() != null 
     |     |  | 
     |     null false 
     com.someapp.domain.EmploymentHistory : null 

    at com.someapp.controller.EmploymentHistoryControllerTests.testShow(EmploymentHistoryControllerTests.groovy:78) 

为编辑:

junit.framework.AssertionFailedError: Assertion failed: 

assert employmentHistory.save() != null 
     |     |  | 
     |     null false 
     com.someapp.domain.EmploymentHistory : null 

    at com.someapp.controller.EmploymentHistoryControllerTests.testEdit(EmploymentHistoryControllerTests.groovy:97) 
+3

你说 “>因此,我将它复制到适当的控制器测试,并更改了所有$ {propertyName}和$ {className}。” 当您使用内部grails命令时,Grails将使用这些模板来生成您的控制器,测试,域等。你不需要手动替换它们。你可以说创建单元测试或创建整合测试和你的班级的名称 – Alidad 2012-02-13 20:24:04

回答

1

assert employmentHistory.save() != null的失败表明你EmploymentHistory域对象没有验证。确保您的参数符合您为EmploymentHistory声明的所有限制条件。