3

我已经为此命令对象使用了手动编写的以及 Grails 生成的单元测试:

   package myapp

    @grails.validation.Validateable
    class SearchCommand {
       String basisBuild
       String buildToSearch

       static constraints = {
          basisBuild(blank: false)
       }
    }

在我的手写单元测试失败后,我使用了 Grails:

create-unit-test  myapp.SearchCommand

我填写了单元测试,并做出了一个断言,该断言应该通过关于模拟约束的每个文档:

package myapp
import static org.junit.Assert.*

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

@TestMixin(GrailsUnitTestMixin)
class SearchCommandTests {

    void setUp() {
        mockForConstraintsTests(SearchCommand)
    }

    void tearDown() {
        // Tear down logic here
    }

    void testSomething() {
        SearchCommand commandUnderTest = new SearchCommand()

        commandUnderTest.validate(basisBuild: "")

        assertEquals "blank", commandUnderTest.errors['basisBuild']
    }
}

为什么我会失败?

grails> test-app
| Running 9 unit tests... 9 of 9
| Failure:  testSomething(com.siemens.soarian.sf.gap.SearchCommandTests)
|  java.lang.AssertionError: expected:<blank> but was:<null>
        at org.junit.Assert.fail(Assert.java:93)
4

3 回答 3

5

我相信我找到了 grails 支持的方式来对 grails 2.0 中的 Command 对象进行单元测试。您需要使用 ControllerUnitTestMixin 提供的 mockCommandObject。

归功于埃里克

http://www.jworks.nl/2012/04/12/testing-command-objects-in-grails-2-0/

于 2013-05-24T15:10:42.467 回答
2

编辑

如果现有Grails 错误中提到的补丁已经到位,使用validate()适当并且应该可以工作(感谢@codelark 提出)。为了从 Web App 的角度测试命令对象(使用),以下信息会有所帮助。mockForConstraintsTestcontroller

使用控制器操作测试命令对象:-

仅当对象command用作. 请参阅命令对象(警告说明)。在一个动作方法中使用,你应该能够.actioncontrollerSearchCommandassertEquals

样本:

void testSomething() {
        YourController controller = mockController(YourController) //Or instantiate
        SearchCommand commandUnderTest = new SearchCommand ()
        //Note the usage here. validate() does not take parameters
        commandUnderTest.basisBuild = ''
        commandUnderTest.validate()

        //Call your action
        controller.searchCommandAction(commandUnderTest)

        assert response.text == 'Returned'
        assertEquals "blank", commandUnderTest.errors['basisBuild']
    }

YourController 的操作:-

def searchCommandAction(SearchCommand sc){
    render "Returned"
}

笔记:

如果没有 grails 错误的补丁,我们会在 @Grails 2.1.4、2.2.0 和 2.2.1 中看到以下错误

当我只更正validation和使用mockForConstraintTests而不使用时出现错误controller action

在此处输入图像描述

于 2013-04-19T18:03:39.260 回答
0

您使用的validate方法不正确。您从未在类上设置字段,因此该字段为空,而不是空白。尝试如下更改您的测试:

void testSomething() {
    SearchCommand commandUnderTest = new SearchCommand()
    commandUnderTest.basisBuild = ""

    assertFalse commandUnderTest.validate()
    assertEquals 'blank', commandUnderTest.errors['basisBuild']
}

编辑:在测试使用注释的命令类时还有一个grails 错误。@Validatable错误评论中有一些解决方法。

于 2013-04-19T18:43:15.967 回答