Утвердить каждый ключ объекта как массив - PullRequest
0 голосов
/ 07 марта 2020

У меня есть объект как структура ниже для ответа API.

{
    "status": true,
    "message": "Successfully fetch all items!",
    "data": {
        "services": [
            {
                "id": "E",
                "name": null,
                "price": 50,
                "discount_per": 2
            }
        ],
        "combos": [
            {
                "id": "w",
                "name": "3 Times Oil change, 4 Itmes Car Wash",
                "price": 5000,
                "discount_per": 10,
                "start_date": null,
                "expiry_date": "2020-02-04T12:00:00.000Z"
            }
        ]
    }
}

Мне нужно написать модульный тест для этой структуры.

Здесь, если нет данных , данные будут {}.
ключей services и combos не будет, если внутри них нет данных, также они всегда будут массивом объектов

Это то, что я пробовал.

const expect = require('chai').expect
const request = require('supertest')
const _ = require('lodash')

const app = require('../../src/app')


describe('GET /api/v1/items', function () {
    it('OK, Got items successfully', async () => {
        const result = await request(app)
            .get('/api/v1/items')
            .set('Accept', 'application/json')
            .expect('Content-Type', /json/)
            .expect(200)
        expect(result)
            .to.be.a('Object')
        expect(result.body.status, "status should be a boolean and true")
            .to.be.a('Boolean').true
        expect(result.body.data, "data should be an Object and every key should an Array")
            .to.satisfy(data => {
                if(!_.isEmpty(data)) {
                    expect(data).to.have.any.keys('services', 'combos')  
                    _.forOwn(data, (value, key) => {
                        expect(data[key]).to.be.a('Array')
                     })
                }
            })   
    })
})

Но я получаю ошибку ниже.

1) GET / api / v1 / items
OK, элементы получены успешно:
AssertionError: данные должны быть Объект и каждый ключ должны Array: ожидаемый {Object (services, combos)}, чтобы удовлетворить [Function]
в Context. (test \ items \ getAllItems. js: 20: 17)
в processTicksAndRejection (внутренний / process / task_queues. js: 94: 5)

1 Ответ

0 голосов
/ 07 марта 2020

Я исправил это, это была глупая ошибка, которую я не заметил. Я ничего не возвращал от удовлетворения удовлетворения.

describe('GET /api/v1/items', function () {
    it('OK, Got items successfully', async () => {
        const result = await request(app)
            .get('/api/v1/items')
            .set('Accept', 'application/json')
            .expect('Content-Type', /json/)
            .expect(200)
        expect(result)
            .to.be.a('Object')
        expect(result.body.status, "status should be a boolean and true")
            .to.be.a('Boolean').true
        expect(result.body.data, "data should be an Object and every key should an Array")
            .to.satisfy(data => {
                expect(data).to.be.a('Object')
                if(!_.isEmpty(data)) {
                    expect(data).to.have.any.keys('services', 'combos')  
                    _.forOwn(data, (value, key) => {
                        expect(data[key]).to.be.a('Array')
                     })
                    return true
                }
                return true
            })   
    })
})
...