我正在创建我的测试套件,我使用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对象的特殊方法。
答案 0 :(得分:0)
这里的问题是,由于JSON文件在技术上是表示对象的字符串,因此顺序很重要。
包含{ id: 1, phrase: "hello" }
的JSON文件与包含{ phrase: "hello", id: 1 }
的JSON文件不同。
即使两个文件都语义相同,字符串本身也不会因此测试失败。
截至目前,没有解决方案。我找到的最佳选择是创建一个自定义的sinon匹配器:
How to personalize error message sinon matchers
希望将来帮助其他人!