如何将 json 对象与 sinonChai 进行比较?

How to compare json object with sinonChai?

背景

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

为了结合两者,我使用 sinon-chai

Objective

我想确保使用正确的参数调用我的存根。为此,我必须遵循以下行:

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 个对象?

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

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

的文件不同

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

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

How to personalize error message sinon matchers

希望以后对其他人有所帮助!