0

背景

我正在创建我的测试套件,并将 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 转换为 Javascript 对象JSON.parse,然后进行比较。这样测试就通过了,但是当我应该能够开始比较两个 JSON 对象时,这个解决方案很糟糕。

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

问题

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

1 回答 1

0

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

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

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

到目前为止,还没有解决方案。我发现最好的选择是创建一个自定义的 sinon 匹配器:

如何个性化错误消息 sinon 匹配器

希望它在未来对其他人有所帮助!

于 2017-10-31T11:59:03.447 回答