Pact,确保数组中的键名

时间:2018-04-24 12:03:41

标签: arrays pact

如果返回的json是一个映射,则将证明在body响应中指定的所有键名都存在。所以

DEBUG SMTP: exception reading response: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
javax.mail.MessagingException: Exception reading response;
  nested exception is:
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:1090)
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:986)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:197)
    at javax.mail.Service.connect(Service.java:233)
    at javax.mail.Service.connect(Service.java:134)
    at Servlets.Sendmail.send_java_mail(Sendmail.java:92)
    at Servlets.PlaceOrder.doGet(PlaceOrder.java:64)
    at Servlets.PlaceOrder.doPost(PlaceOrder.java:72)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1132)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1539)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1495)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

将确保该主体包含一个键" field1"如果丢失,则会发生错误。

但是如果响应体是一个数组呢?如果此数组中的所有或至少一个元素具有特定的键名,我认为没有机会进行测试。但这很重要,我希望在后端的密钥名称发生变化时收到警告,因为这会在我的应用程序中产生错误。

1 个答案:

答案 0 :(得分:3)

您可以使用eachLike指定数组元素与特定格式匹配。正确的语法取决于您使用的Pact框架,但是使用pact-js,您会说:

const { somethingLike: like, term, eachLike } = pact
....

willRespondWith: {
   status: 200,
   body: eachLike({
    "field1": "value1"
   })
}

这是relevant part of the documentation

您的示例建议您自己编写Pact文件 - 如果是这种情况,您可以使用[*]表示法来描述任何数组元素,如specification中所述: / p>

"response": 
{
  "status": 200,
  "body": 
    [ 
      {
        "field1": "value1"
      }
    ],
  ...

  "matchingRules": {
     "$.body": {
       "min": 1,
       "match": "type"
     },
     "$.body[*].field1": {
        "match": "type"
     },
  ...