首页 > 解决方案 > 空手道框架中基于子字符串存在的 Json 响应验证

问题描述

我正在尝试根据条件验证具有可选键的 JSON。Json响应如下:

{ "hits": [
            {
               
                "_type": "sessions",
                "_source": {
                    "movie_name": "The Greatest Showman (U/A) - English",
                    "session_data": {
                        "freeSeating": false,
                        "mandatoryItems": [],
                        "areas": [
                            {
                                "seatingType": "fixed"
                            },
                            {
                                "seatingType": "free"
                            },
                            {
                                "seatingType": "mixed"
                               
                            }
                        ]
                    }
                }
            },
            { 
                "_type": "sessions",
                "_source": { 
                    "movie_name": "The Greatest Showman (U/A) - English",
                    "session_data": {
                        "freeSeating": false,
                        "mandatoryItems": [],
                        "areas": [
                            {
                                "seatingType": "fixed"   
                            },
                            {
                                "seatingType": "free"
                            }
                        ]
                    }
                }
            },
            {
                
                "_type": "sessions",
                "_source": {
                    
                    "movie_name": "The Greatest Showman 3D (U/A) - English",
                    
                    "session_data": {
                        "freeSeating": false,
                        "mandatoryItems": [
                            {
                                "quantity": 1,
                                "level": "ticket",
                                "price": 30,
                                "type": "3dglasses"    
                            }
                        ],
                        "areas": [
                            {
                                "seatingType": "fixed"
                            }       
                        ]
                    }
                }
            }
        ]
    }

如果movie_name 中包含“3D”,则mandatoryItems = [{“quantity”:1,“level”:“ticket”,“price”:30,“type”:“3dglasses”}]

如果movie_name 中不包含“3D”,则mandatoryItems = []

我想在我的功能文件中实现上述断言。

注意: “movie_name”和“mandatoryItems”存在于数组的每个元素中。所以我想在整个数组上断言这个条件。

提前致谢!!

标签: jsonkarate

解决方案


抱歉@Peter 给我带来的不便。我通过引用所有可能的来源来处理这个问题陈述,并编写了以下代码,这给了我想要的输出:

    Given url api_url
    When method Get
    And def mandatoryItems_present =
    """
    {
         "quantity": 1,
         "level": "ticket",
         "price": '#number',
         "type": "3dglasses",
    }
    
    """
    Then status 200
    And print response
    And def source_list = karate.jsonPath(response, '$.._source')
    And print source_list
    And match each source_list[*].session_data contains {'freeSeating': '#boolean','mandatoryItems':'##[] mandatoryItems_present'}
    And def movie_names = get source_list[*].movie_name
    And def mandatoryItems_list = get source_list[*].session_data.mandatoryItems 
    And def name_size = names.size();
    And print name_size
    And def threeD_movie_list = new ArrayList()
    And eval for(var i = 0; i < name_size; i++) {if (names[i].match('3D')) threeD_movie_list.add(names[i])} 
    And print threeD_movie_list
    And def threeD_movies_array_size = threeD_movie_list.size();
    And print threeD_movies_array_size
    And print expected
    And def expected = (threeD_movies_array_size == 0 ? {"mandatoryItems" : []} : {'mandatoryItems' : [mandatoryItems_present]} )
    And print expected
    And match each response.hits[*]._source.session_data[*].mandatoryItems == expected

请让我知道这种方法是否正确。


推荐阅读