如何测试grails Criteria查询?

kma*_*man 7 testing grails criteria

先在这里发帖,希望与很多人有关.

我正在为域编写集成测试,在该域上我使用该withCriteria()方法进行查询.我在网上搜索过,发现很多可以给你详细说明如何模拟标准查询,但没有关于如何准确测试它.

我已经尝试使用该mockDomain(domain,list)函数模拟域,并设置一个域以供测试使用,setUp()然后调用标准,我什么也得不到.我在findBy这里做了类似的并得到了结果,但不完全是我正在寻找的.我很确定这不仅仅是我的查询,而是标准,我在几个地方读过标准在服务测试中不起作用.到目前为止,该查询在应用程序中对我有用,但我希望有一些测试,以后我可以参考,以防我的代码库发生变化.

我实际上已经完成了许多建议并提取了查询的代码并使其成为我的域中的静态方法,以便我可以为使用它的测试模拟它,但现在我仍然坚持如何实际测试这部分.我是否需要运行应用程序并从该角度进行功能测试,或者在grails单元/集成测试中是否可以通过某种方式执行此操作.我将在下面发布我的查询.

static Attribute getDefinitionsUsingCriteria(List categoryNames, List types){
        def definitions = Definition.withCriteria() {
            and {
                'in'('type', types)
                if (categoryNames) {
                    categories {
                        'in'('name', categoryNames)
                    }
                }
            }
        }
        return definitions
    }
Run Code Online (Sandbox Code Playgroud)

定义具有字符串属性类型,并且具有类型的属性类别,Set该集合中的每个元素都具有Stringname属性.

我还是刚刚接触过grails并且已经阅读了很多参考书,我很惊讶到目前为止我读过的所有书中都没有这本书.我希望这对我来说只是一个错误,并且容易测试.我感谢任何帮助,感谢阅读这篇长篇文章.

JR.

Vic*_*nko 7

一种方法:将测试从文件夹移动test/unittest/integration文件夹.标准在单元测试中不起作用(那里没有Hibernate),但是在集成中.切勿mockDomain()在集成测试中使用.

注意:不要使方法静态 - 它只会使测试复杂化.

第二种方式:在单元测试中 - 使用mockDomain().只需依靠逻辑非常简单的事实,并对除方法之外的所有内容进行单元测试.覆盖它setUp()像:

Definition.metaClass.getDefinitionsUsingCriteria = { List categoryNames, List types ->
    delegate.findAll{ (it.type in types) && 
        (it.categories.find { c -> c in categoryNames }) 
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我同意 - 不要单元测试持久性,你只是测试模拟框架.使用与数据库的集成测试来测试持久性,数据库可以是默认的内存数据库,也可以是"真实"数据库. (2认同)