当前位置: 首页 > 知识库问答 >
问题:

空手道-预期的JSON模式中的自定义断言

申博厚
2023-03-14

我希望对从文件加载的JSON中的字段执行自定义断言。

我知道我们有模糊匹配,但我想执行一些更自定义的操作,例如,有一个函数将日期解析为LocalDateTime:

public class DateUtil {
public static boolean matchesMyDateFormat(String dateStr) {
    try {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        LocalDateTime.parse(dateStr, formatter);
    } catch (DateTimeParseException e) {
        return false;
    }
    return true;
}

}

* def matchesMyDateFormat =
"""
function fn(dateX){
  return Java.type('com.karate.DateUtil').matchesMyDateFormat(dateX);
}
"""

* def expected = read('expected.json')
* def actual = read('actual.json')
* match expected == actual
{
   "date1" : "#? matchesMyDateFormat(_)"
}

NB这是专门用于从文件加载的JSON,而不是在特性文件本身中指定的JSON上(例如,这里的isValidTime()是:https://github.com/intuit/karate/blob/master/karate-junit4/src/test/java/com/intuit/karate/junit4/demos/schema-like.feature)。

希望这样做的理由很少:

  • 我需要断言的一些有效负载有许多不同格式的日期字段返回。像上面这样的断言将很好地与空手道的验证模式的优秀方式结合起来。然而,在特性文件中这样做将需要大量代码,即每个日期都需要一行代码(我知道可以使用match each--但即使这样也会变得复杂,这取决于字段的嵌套。)
  • 我可以将此函数添加到我的通用utils功能文件中,这样就可以在整个项目的预期响应模式中重用它。
  • 除此之外,我还想做其他事情,比如检查一个日期发生在另一个日期之前(但我想在Java中使用各种类型来做这件事,例如考虑时区)。
  • 我还将寻找格式匹配方法,以接受另一个参数,该参数允许测试人员指定自定义格式字符串。

注:我已经通读了文档和其他文档,所以答案与日期断言有关,我相信这是一个稍微不同的问题。

目前在空手道上有没有可能做到以上这些呢?

共有1个答案

杜河
2023-03-14

您可以在karate-config.js中添加函数,这些函数将是“全局”的。例如:

var config = {};
config.isValidDate = read('classpath:is-valid-date.js');
return config;

现在可以在任何功能中使用isValidDate(_)。注意,JS函数可以采用多个参数,例如:

* match foo == { bar: "#? isValidDate(_, 'MYFORMAT')" }

在0.9.6.rc4中,我们做了改进,以便您可以将复杂的条件逻辑,甚至match操作移到可重用的JS文件中:https://github.com/intuit/karate/issues/1202

请注意,大量执行此操作可能导致测试不可读:https://stackoverflow.com/a/54126724/143475

一个提示是,您可以使用karate.foreach()将所有日期字段提取到一个数组中,然后一个match each就可以工作了。

最后,如果你仍然觉得“你的特性文件中有太多代码”,我不知道,也许你需要咨询一下魔术师。

 类似资料:
  • 我从空手道功能文件中的SQL查询返回了以下日期: 但这对我不起作用。但下面的工作和返回31-00-19,但我想要31-Jan-20格式 任何帮助都将不胜感激!

  • 我正在尝试验证具有可选键的复杂JSON 下面是完整的可执行特性文件 我想验证ValidJsonSchema,但无法绕过完整的模式匹配 当我尝试匹配可选字段时,我一直得到错误为 com.intuit.karate.exception.karateException:应在路径$中找到属性为[“MyArray”]的对象,但发现了“net.minidev.json.JsonArray”。根据JSONPro

  • 如果我想做以下事情: 它将在两种情况下评估变量,因此在其中一种情况下,我得到类似第1个场景和在第二个场景中。 如果可能的话,我会避免硬编码这个值,我读过关于的文章,但没有使用它,有一个独立的文件来生成时间戳听起来很有趣。 我正在使用空手道网络,你对如何实现这一点有建议吗?:) 谢谢

  • 使用自定义属性扩展JSON模式有效吗? 我问这个问题的原因是,因为我使用一个模式来为该模式描述的JSON呈现一个表单(模式中描述的每个属性都用作带有标签和某种输入的表单元素)。 能够使用一些我主要用于表单呈现的属性来扩展模式是很有用的,但是当使用模式来验证JSON对象本身时,就会忽略这些属性。 对于JSON对象,我可以有两种不同的表示形式(一种是模式,另一种是类似模式的对象,它具有自定义属性,我只

  • 我试图为下面的响应编写JSON模式。响应是动态的它可以是细节或细节。如果响应中的是,那么响应将包含人对象(组织对象将不可用)。如果是,组织详细信息将包含在响应中(人对象将不可用)。下面给出了两种不同的预期反应 我试图使用下面给出的模式使上述条件有效 我目前面临的问题是,如果响应中的是,它会抛出以下错误 是否有任何方法可以在模式中指定,如果person对象可用,则organization对象将不可用

  • 我只是想知道如何进行条件模式验证。API响应是基于键的动态响应。如果是,那么,人的详细信息将被包括,如果是组织的详细信息将被包括在JSON响应中。所以响应可以是以下任何一种形式 我为验证上述2个场景而创建的架构如下 但是架构与实际响应不匹配。我应该对架构进行哪些更改才能使其工作?