【问题标题】:Karate mock - how to match against request body content空手道模拟 - 如何匹配请求正文内容
【发布时间】:2019-08-12 07:42:17
【问题描述】:

对于空手道,我正在尝试研究如何根据请求正文的内容返回不同的模拟响应。

我有

Feature: ...
Scenario: pathMatches('/users/login') && methodIs('post') && request == {"username": "gooduser", "password": "goodpassword"}
  * def responseStatus = 200
  * def response = {"status: login ok"}
Scenario: pathMatches('/users/login') && methodIs('post') && request == {"username": "baduser", "password": "badpassword"}
  * def responseStatus = 401
  * def response = {"status: login not ok"}
Scenario:
  * print request
  * print requestHeaders

当我发送带有“gooduser”或“baduser”详细信息的请求时,它们会陷入默认情况。这会打印请求,看起来就像我所期望的那样。

例如,如果我运行

curl -X POST -d '{"username":"baduser","password":"badpassword"}' http://localhost:8999/users/login

我可以在空手道日志中看到前 2 个场景被跳过并且比赛开始(空)。但是,日志也会打印出看起来正确的请求正文,所以我很惊讶第二种情况与我发送的请求不匹配。

另外,如果我从场景中删除 '&& request = {...}' 子句,匹配工作正常。

感觉好像我遗漏了一些明显的东西 - 谁能指出我正确的方向?

【问题讨论】:

    标签: mocking karate


    【解决方案1】:

    是的,== 符号不适用于复杂对象(在任何语言中),这就是为什么空手道的 match 语法如此重要的原因。请记住,Scenario 表达式被评估为纯 JavaScript。

    编辑:对你来说最简单的选择是直接使用request 对象。由于在您的情况下是 JSON,因此像 request.username == 'gooduser' 这样的简单 JS 表达式将起作用!

    对于那些使用 XML 的人,有一些空手道功能可以满足您的需要。 bodyPath() 也适合您。最好根据有效负载中的一两个值做出决定,而不是全部,这就是 real 服务器无论如何都会做的事情:

    Scenario: pathMatches('/users/login') && methodIs('post') && bodyPath('$.username') == 'gooduser'
    

    你也可以使用karate.match(request, json),但不会那么优雅。

    正如我最初在评论中提到的,您可以将决定回复什么的逻辑移到Scenario 的正文中,如下所示:

    * def response = request.username == 'gooduser' ? read('good.json') : read('bad.json')
    

    【讨论】:

    • @monch1962 欢迎您!我忘了提到,有时,一旦你在 within 使用if 条件,Scenario 可能是最简单的选择!因为您可以访问request.username,例如
    • 通过反复试验,我发现&& request.username == 'gooduser' 也适用于场景行
    • @monch1962 是的,我应该首先建议,让我编辑我的答案,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    相关资源
    最近更新 更多