如何将 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 个对象。
问题
- 是否可以完全使用 sinonChai 比较 JSON 个对象?如果是,我该怎么做?
- 如何使用 sinon 和 chai 比较 JSON 个对象?
这里的问题是,由于 JSON 文件在技术上是表示对象的字符串,因此顺序很重要。
包含 { id: 1, phrase: "hello" }
的 JSON 文件与包含 { phrase: "hello", id: 1 }
.
的文件不同
即使两个文件在语义上是相同的,字符串本身也不会因此测试失败。
截至目前,还没有解决方案。我找到的最佳选择是创建自定义 sinon 匹配器:
How to personalize error message sinon matchers
希望以后对其他人有所帮助!
背景
我正在创建我的测试套件,我正在使用 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 个对象。
问题
- 是否可以完全使用 sinonChai 比较 JSON 个对象?如果是,我该怎么做?
- 如何使用 sinon 和 chai 比较 JSON 个对象?
这里的问题是,由于 JSON 文件在技术上是表示对象的字符串,因此顺序很重要。
包含 { id: 1, phrase: "hello" }
的 JSON 文件与包含 { phrase: "hello", id: 1 }
.
即使两个文件在语义上是相同的,字符串本身也不会因此测试失败。
截至目前,还没有解决方案。我找到的最佳选择是创建自定义 sinon 匹配器:
How to personalize error message sinon matchers
希望以后对其他人有所帮助!