如何使用模拟域在 grails 单元测试中测试默认排序

2024-03-03

是否可以测试排序propertyName这是定义在staticMappingBlock?

这在集成阶段有效,但在我的域具有的单元阶段无效:

static mapping = {
    sort 'lastName'
}

void testDefaultSortOrder(){
    def agent1 = new CommissionAgent(firstName: 'fred', lastName: 'b', active:true).save()
    def agent2 = new CommissionAgent(firstName: 'fred2', lastName:'a', active:false).save()

    def agents = CommissionAgent.list()
    assertEquals 'sort order is wrong', agents[0].lastName, agent2.lastName
    assertEquals 'sort order is wrong', agents[1].lastName, agent1.lastName

}

Grails 版本是 1.3.1


据我所知,没有任何好的方法来测试单元测试中的实际排序。您尝试测试的实际上是 GORM 集成的一个组成部分,即使它们支持排序映射,在模拟域对象上测试它也不会测试将运行的实际代码。

您在单元测试中可以做的最接近的事情是查看静态映射对象,以断言“sort”的值已设置为您期望的值。

我整理了一个博客文章 http://naleid.com/blog/2010/01/24/interrogating-arbitrary-groovy-closures-for-values/不久前关于如何询问常规闭包的值。此技术可用于断言排序顺序设置为您期望的值,如下所示:

Foo 域对象:

package com.example

class Foo {

    String name

    static mapping = {
           sort "name"
    }
}

FooTests 单元测试:

package com.example

import grails.test.*

class FooTests extends GrailsUnitTestCase {
    void testFooSort() {
         def mappingValues = ClosureInterrogator.extractValuesFromClosure(Foo.mapping)
         assertEquals "name", mappingValues.sort
    }
}

ClosureInterrogator 类允许您查看闭包的作用:

package com.example

class ClosureInterrogator {
    private Map closureValueMap = [:]

    static Map extractValuesFromClosure(Closure closure) {
        def interrogator = new ClosureInterrogator(closure)
        return interrogator.closureValueMap
    }

    private ClosureInterrogator(Closure closure) {
        def oldResolveStrategy = closure.getResolveStrategy()
        def oldDelegate = closure.getDelegate()
        closure.delegate = this
        closure.resolveStrategy = Closure.DELEGATE_FIRST

        try {
            closure()
        } finally {        
            closure.setDelegate(oldDelegate)
            closure.setResolveStrategy(oldResolveStrategy)
        }
    }

    // property getter
    def propertyMissing(String name) {
        return closureValueMap[name]
    }

    // property setter
    def propertyMissing(String name, value) {
        closureValueMap[name] = value
    }

    def methodMissing(String name, args) {
        if (args.size() == 1) {
            closureValueMap[name] = args[0]
        } else {
            closureValueMap[name] = args
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用模拟域在 grails 单元测试中测试默认排序 的相关文章

随机推荐

  • 核心数据和分页

    我有一个包含 50 000 条记录的数据库 我正在使用核心数据从搜索中获取记录 一次搜索可以轻松返回 1000 条记录 使用 core data 和 uitableview 来分页这些记录需要什么 我想一次显示 100 条记录 并在查看 1
  • iOS 中如何将字符串的一部分加粗?

    我想让文本字符串的某些部分变为粗体 Eg 这就是要大胆 这是正常的字符串 在Android中 可以通过使用可生成字符串轻松实现 iOS 中的等价物是什么 是的 可以通过以下方式实现NSAttributedString https devel
  • Laravel 用户特定的缓存

    我从来没有对缓存做过太多事情 但现在我正在尝试尝试一下 我有一个返回大量数据的仪表板 为了减轻负载 我像这样缓存数据 return cache gt rememberForever something function return aut
  • EF Core 2.2,将字符串参数传递给 FromSql 语句

    public List
  • 如何一次反编译多个jar?

    好吧 我想主题已经说明了一切 理想的解决方案将找到某个文件夹中的所有 jar 它们可能位于子文件夹中 并将找到的所有源写入单个 src 目录 当然还要维护包文件夹 具体用例 反编译所有 Eclipse 插件 jar 下载JAD反编译器 ht
  • 在 PHPUnit 中,如何模拟父方法?

    我想测试一个调用同名父方法的类方法 有没有办法做到这一点 class Parent function foo echo bar class Child function foo foo parent foo return foo class
  • 无法修复“语法错误,‘foreach’语句仅在源级别为 1.5 时可用”

    我正在编写一个 Java 代理 它使用参数化集合类型和增强的 for 循环 然后 Domino Designer 8 5 3 告诉我通过快速修复操作将项目的合规性级别更改为 1 5 如果我这样做 项目就会重建 并且不会发生任何变化 如果我转
  • Shopify.onItemAdded 更新#cart 和 cart.item.count

    我正在尝试在 Shopify 中制作一个 ajaxed 购物车 我已使产品页面将商品添加到购物车 而无需刷新或转到购物车页面 要查看购物车 您可以单击输入或带有 cart show 的链接 因此我将其添加到 添加到购物车 输入中
  • 使用 Pyspark 进行单元测试:未关闭的套接字警告

    我想使用 PySpark 进行单元测试 测试本身有效 但是对于我得到的每个测试 ResourceWarning unclosed
  • 如何使目录可写? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何从 OS X 终端使目录可写 chmod w
  • Windows 窗体设计器破坏了窗体布局

    今天早上 我在 Visual Studio Windows 窗体设计器中偶然发现了一个奇怪的问题 我有一份表格 现在已经使用了大约一个月 没有任何变化 在应用程序中看起来像这样 文本变得不可读 因为我不完全确定这里的法律含义 现在从今天开始
  • gpg --homedir 更改目录不起作用

    我们有一台 Windows Server 2008 R2 服务器 我们安装了 gpg4win 并且它可以工作 我们可以创建公钥和私钥 并为那些拥有我们的公钥的人解密消息 问题 gnu 安装默认为我的用户配置文件 我们希望它位于通用配置文件下
  • iOS - 以编程方式设置 UIContainerView 的嵌入式 UIViewController

    我有一个UIViewController with a UIContainerView里面 根据某个条件是否成立 我想以编程方式将容器视图的嵌入视图设置为不同的UIViewController 我注意到你只能用一个嵌入转场来设置一个UIVi
  • Google Map API 方向三角形图标不明确

    I am using Google Map API V3 to show the vehicle traveled path and its route directions But by google direction icon its
  • 如何通过内键对多维数组进行排序

    我有一个巨大的数组 是从 BattleField Bad Company 2 的 API 中提取的 并且士兵统计数据可以作为多维数组提取 每个士兵都有一个内部数组 但是 API sormats 它按名称字母顺序对士兵进行排序 我想按等级对它
  • Count() 列表中的特定属性#

    if gardenvlist Count getava Count else if oceanvlist Count getava Count else if cityvlist Count getava Count gardenvlist
  • 启动活动时出现 NullpointerException

    我有一个可以执行此操作的数组列表 ArrayList
  • C11 中是否有定义的方法来进行指针减法?

    有没有一种方法可以在 C11 中将一个指针与另一个指针相减 并始终定义结果 该标准规定 如果结果不能表示为 ptrdiff t 类型 则行为未定义 我对依赖于静态断言的解决方案持开放态度 该解决方案有望在现代通用 32 或 64 位环境中传
  • 为什么我永远不应该在标志枚举中使用 0 [重复]

    这个问题在这里已经有答案了 可能的重复 枚举应该以 0 还是 1 开头 https stackoverflow com questions 7257409 should an enum start with a 0 or a 1 为什么我不
  • 如何使用模拟域在 grails 单元测试中测试默认排序

    是否可以测试排序propertyName这是定义在staticMappingBlock 这在集成阶段有效 但在我的域具有的单元阶段无效 static mapping sort lastName void testDefaultSortOrd