如何比较json对象与sinonChai?

时间:2017-10-19 10:05:23

标签: javascript json sinon chai sinon-chai

背景

我正在创建我的测试套件,我使用sinon作为存根和chai作为断言框架。

要合并两者,我使用的是sinon-chai

目的

我想确保使用正确的参数调用我的存根。要做到这一点,我必须遵循以下几行:

expect(myStub).to.be.calledWith(jsonObj);

我使用的json对象如下:

{
    "info": [
        {
            "amenities": {
                "air": true,
                "heating": true,
                "pets": true,
                "pool": false,
                "terrace": false,
                "wifi": true
            },
            "apartmentName": {
                "br": "Incrível apartamento. No centro da cidade",
                "de": "Umfangreiche Wohnung in Mitte. In Barcelona",
                "en": "Central apartment. Simply charming!",
                "es": "Gran apartamento en buena zona ¡Genial!",
                "fr": "Totalement imposant! Près de toutes les attractions de Barcelone",
                "it": "Straordinario appartamento con aria condizionata, a Barcellona",
                "nl": "Welkom bij Barcelona! Comfortabel appartement"
            },
            "bedrooms": 2,
            "city": 1,
            "cityName": {
                "en": "Barcelona",
                "it": "Barcellona"
            },
            "coordinates": {
                "lat": 38.7223,
                "lng": -9.1393
            },
            "id": 17,
            "mfc": 150,
            "numReviews": 0,
            "partnerId": 23,
            "partnerName": "Booking.com",
            "photo": "http://images.friendlyrentals.com/FR_imgs/Property_4089/PrImg_4089_1_lg.jpg",
            "photos": [
                22174376,
                22174377,
                22174378,
                22174379,
                22174380
            ],
            "rating": 0,
            "ref": 4089,
            "sameApartments": [
                630534,
                3136848
            ],
            "sleeps": 5,
            "sqm": 95
        },
        {
            "amenities": {
                "air": true,
                "heating": true,
                "pets": true,
                "pool": false,
                "terrace": false,
                "wifi": false
            },
            "apartmentName": {
                "br": "Incrível apartamento. No centro da cidade",
                "de": "Umfangreiche Wohnung in Mitte. In Barcelona",
                "en": "Central apartment. Simply charming!",
                "es": "Gran apartamento en buena zona ¡Genial!",
                "fr": "Totalement imposant! Près de toutes les attractions de Barcelone",
                "it": "Straordinario appartamento con aria condizionata, a Barcellona",
                "nl": "Welkom bij Barcelona! Comfortabel appartement"
            },
            "bedrooms": 2,
            "city": 1,
            "cityName": {
                "en": "Barcelona",
                "it": "Barcellona"
            },
            "coordinates": {
                "lat": 38.7223,
                "lng": -9.1393
            },
            "id": 19,
            "mfc": 150,
            "numReviews": 0,
            "partnerId": 1,
            "partnerName": "FriendlyRentals",
            "photo": "http://images.friendlyrentals.com/FR_imgs/Property_4089/PrImg_4089_1_lg.jpg",
            "photos": [
                22174376,
                22174377,
                22174378,
                22174379,
                22174380
            ],
            "rating": 4,
            "ref": 4089,
            "sameApartments": [
                61414
            ],
            "sleeps": 5,
            "sqm": 95
        }
    ],
    "requestId": "kjdhsabkdhbvashdfv"
}

问题

通过使用http://www.jsondiff.com/我知道我接收的对象和我要比较的对象是相同的JSON对象。

然而,无论我做什么,测试总是失败,好像两个对象不同。

要解决此问题,我尝试使用chai-json-equal但它也失败了。

目前唯一的解决方案是在我的存根上使用callsFake,通过JSON.parse手动将JSON转换为Javascript对象,然后进行比较。这样测试通过,但是当我应该能够比较两个JSON对象时,这个解决方案很糟糕。

我还检查了sinon-chai文档,并且没有任何比较JSON对象的特殊方法。

问题

  1. 是否可以使用sinonChai来比较JSON对象?如果是,我该怎么做?
  2. 如何使用sinon和chai比较JSON对象?

1 个答案:

答案 0 :(得分:0)

这里的问题是,由于JSON文件在技术上是表示对象的字符串,因此顺序很重要。

包含{ id: 1, phrase: "hello" }的JSON文件与包含{ phrase: "hello", id: 1 }的JSON文件不同。

即使两个文件都语义相同,字符串本身也不会因此测试失败。

截至目前,没有解决方案。我找到的最佳选择是创建一个自定义的sinon匹配器:

How to personalize error message sinon matchers

希望将来帮助其他人!