gpt4 book ai didi

testing - 字符串中 "\"转义字符的 Groovy/Grails 扩散

转载 作者:行者123 更新时间:2023-11-28 20:36:28 26 4
gpt4 key购买 nike

这是一个相当奇怪的问题。我正在集成测试 Grails 服务和关联的域类。该域类的一个属性是一个包含 JSON 的 String。数据库字段也是 json 并且有一个自定义的 Hibernate 值类型可以执行必要的转换。它已经在另一个领域类的生产中工作多年。

class MyDomain {
String data
static mapping = {
data type: StringJsonUserType
}
}

到目前为止一切顺利。在我的测试中,我模拟了一个输入对象到我的服务方法,它最终将包含并返回所需的 JSON 字符串。

private MockedClass mockClass() {
// JsonRepresentable declares asJson() method.
def data = GroovyMock(JsonRepresentable)
data.asJson() >> "{\"content\":\"irrelevant\"}"

def mockClass = GroovyMock(MockedClass)
mockClass.getData() >> data

return mockClass
}

服务方式(简体):

void persist(MockedClass mock) {
String string = mock.data.asJson()
def domain = new MyDomain(data: mock.data.asJson())
domain.save()
}

当我使用调试器进入这段代码时,我可以立即看到字符串已从 string 变量中的 {"content":"irrelevant"} 变为"{\"content\":\"irrevant\"}"domain 变量中。

现在合乎逻辑的是,在我的测试中,保存的域类字符串的比较与模拟输入不匹配。

这是从数据库中读取 MyDomain.data 数据时的样子:

"\"\\\"{\\\\\\\"内容\\\\\\\":\\\\\\\"不相关\\\\\\\"}\\\"\""

这是使用 new JsonSlurper().parseText(MyDomain.data) 解析的相同字符串:

"\"{\\\"content\\\":\\\"不相关\\\"}\""

这是使用 JsonSlurper 解析的模拟字符串(如上):

[内容:不相关]

显然最后一个例子是我所期望的。谁能告诉我为什么 Groovy/Grails 会在我的简单且正确转义的字符串中添加大量糟糕的\\?我什至可以尝试使用 Groovy 字符串 '{"content":"irrelevant"}' 但这没有丝毫区别。

最佳答案

只是偶然(在寻找重命名包后出现的其他一些奇怪问题时)我发现了导致问题的原因。在我的域类中,我不仅有 String 属性,还有从该字符串返回 JSON 对象或接受 JSON 对象并将其转换为字符串的 transient getter 和 setter。

class MyDomain {
String data
static mapping = {
data type: StringJsonUserType
}

static transients = ['dataJson']

def getDataJson() {
return new JsonSlurper().parseText(data)
}

void setDataJson(def data) {
data = JsonOutput.toJson(data)
}
}

不幸的是,我在 setDataJson 中有错字。它的名称是 setData,因此它在服务方法中用作我的 String 的 setter 。

void persist(MockedClass mock) {
String string = mock.data.asJson()
def domain = new MyDomain(data: mock.data.asJson())
domain.save()
}

这意味着 JsonOutput.toJson(data) 将我的 JSON 字符串转换为另一个 JSON 字符串,这就是所有其他转义字符的来源。

故事的寓意:切换到一种在编译时强制执行类型系统的正确编译语言。

关于testing - 字符串中 "\"转义字符的 Groovy/Grails 扩散,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52552276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com