0

可能重复:
如何模拟控制器内部的命令对象

我有一个控制器类,里面有一个命令对象。我有一个方法 find() 它使用这个命令对象如下:

class RexController{

    //command object
    class SearchCommand{
        String email
        static constraints={
            email blank:false,email:true
        }

def find = {SearchCommand sc ->
    if(!sc.hasErrors()){
     ----- do something---
}

}

现在,我正在编写一个测试用例来测试控制器中的 find 方法。但是测试用例失败了

  if(!sc.hasErrors())

因为 sc 仍然是'null'。我不确定如何在测试用例中处理这个内部类命令对象。到目前为止我写的测试用例是:

class itemControllerTests extends ControllerUnitTestCase {

    void testFind(){
    def model = controller.find()
    assertNotNull(model)
    }
}

如何处理测试用例中的内部类命令对象。我嘲笑它吗?我尝试过使用 mockCommandObject(?),但不确定我应该如何将内部类命令对象传递给它?

我是否应该在测试用例中更改控制器的任何元类属性,以便它识别内部类。

4

1 回答 1

0

您在测试中创建/模拟并将 Command 实例传递给您的控制器调用。

void testFind() {
    def command = new RexController.SearchCommand(email: 'me@here.there')
    // or [email: 'me@here.there'] as RexController.SearchCommand
    def model = controller.find(command)
    assertNotNull(model)
}

mockCommandObject 不再存在“不再需要 mockCommandObject() 方法,因为 Grails 会自动检测动作是否需要命令对象。”

但是您最好将所有与 UI 无关的逻辑移到其他地方 - 到域类或服务,并测试该类。

于 2012-08-27T16:36:40.503 回答