【问题标题】:How to assert an object containing `Date` properties using chai and deep.equals?如何使用 chai 和 deep.equals 断言包含“日期”属性的对象?
【发布时间】:2020-01-20 11:39:14
【问题描述】:

我有一个使用本机 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 文件加载预期的对象。

【问题讨论】:

  • 您将Date 对象与字符串进行比较。
  • @jonrsharpe 我知道。因为我已经弄清楚了,所以我已经写了问题和答案。
  • 但是您为什么认为这需要问答? [Date: ...]"..." 不同的输出是否不清楚?
  • @jonrsharpe 为了记录我的解决方案并可能为其他人节省几分钟时间。没有比这更基本的了。您认为进行此问答的危害在哪里?
  • 我想我看不到任何人都可以比阅读测试输出更快地搜索和找到它。

标签: javascript json typescript date chai


【解决方案1】:

您的问题不是来自 chai,而是源于对 JSON 格式的限制。由于您将预期对象存储在 JSON 文件中,因此该对象会丢失 Date 类型并转换为字符串。

JSON 仅支持以下类型:

  • 字符串
  • 号码
  • 整数
  • 布尔值

JSON.stringify 在每个对象上调用toString 方法,这就是您在 JSON 中获取字符串的原因。

纠正您有不同的选择。

  • 重构您的代码以将您的 Date 属性转换为日期的字符串表示或数字 UNIX 时间戳。
  • 使用 JSON.parse 的 revive 函数取回一个日期对象。 (这可能会导致不需要的效果,因为它取决于您的属性名称。确保只转换您要转换的日期属性。)

    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);
    });
    

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多