Как установить объект, содержащий свойства `Date`, используя chai и deep.equals? - PullRequest
0 голосов
/ 20 января 2020

У меня есть база кодов машинописного текста, использующая собственный объект Date. Я хочу добавить тестовые случаи к нему, но при сравнении моих объектов с использованием deep.equals я получаю несоответствие:

  AssertionError: expected { date: Mon, 20 Jan 2020 11:05:03 GMT } to deeply equal { date: '2020-01-20T11:05:03.638Z' }
  + expected - actual

   {
  -  "date": [Date: 2020-01-20T11:05:03.638Z]
  +  "date": "2020-01-20T11:05:03.638Z"
   }

Вот мой код:

it.only("compare the date", async () => {
    const date = new Date(Date.UTC(2020, 0, 20, 11, 5, 3, 638));
    const actual = {
        date,
    };

    const expected = JSON.parse(JSON.stringify(actual));

    expect(actual).to.deep.eq(expected);
});

Пример надуман все же в своей кодовой базе я в основном также загружаю ожидаемые объекты из JSON файлов.

1 Ответ

0 голосов
/ 20 января 2020

Ваша проблема не в chai, а в ограничении формата JSON. Поскольку ожидаемый объект сохраняется в файле JSON, он теряет тип Date и преобразуется в строку.

JSON поддерживает только следующие типы:

  • string
  • number
  • integer
  • boolean
  • null

JSON.stringify вызывает метод toString для каждый объект, именно поэтому вы получаете строку в JSON.

, чтобы исправить, что у вас есть различные варианты.

  • Рефакторинг вашего кода для преобразования ваших Date свойств в либо строковое представление даты, либо цифры c UNIX отметок времени.
  • Используйте функцию оживления JSON .parse, чтобы получить объект даты. (Это может привести к нежелательным эффектам, поскольку это зависит от имени ваших свойств. Обязательно конвертируйте только те свойства даты, которые вы хотите преобразовать.)

    it("compare the date", async () => {
        const date = new Date(Date.UTC(2020, 0, 20, 11, 5, 3, 638));
        const actual = {
            date,
        };
    
        const reviver = (key, value) => (key === "date") ? new Date(value) : value;
        const expected = JSON.parse(JSON.stringify(actual), reviver);
    
        expect(actual).to.deep.eq(expected);
    });
    
...