Javascript 如何使用chai和deep.equals断言包含'Date'属性的对象?

Javascript 如何使用chai和deep.equals断言包含'Date'属性的对象?,javascript,json,typescript,date,chai,Javascript,Json,Typescript,Date,Chai,我有一个使用本机Date对象的现有typescript代码库。我想向它添加一个测试用例,但是当使用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:

我有一个使用本机
Date
对象的现有typescript代码库。我想向它添加一个测试用例,但是当使用
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文件加载了预期的对象。

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

JSON仅支持以下类型:

  • 整数
  • 布尔值
  • 空的
JSON.stringify
在每个对象上调用
toString
方法,这就是为什么在JSON中获得字符串

纠正你有不同的选择

  • 重构代码,将
    Date
    属性转换为日期的字符串表示形式或数字UNIX时间戳
  • 使用JSON.parse的resove函数返回日期对象。(这可能会导致不必要的影响,因为这取决于属性的名称。请确保仅转换要转换的日期属性。)


您正在将
日期
对象与字符串进行比较。@jornsharpe我知道。我已经写下了问题和答案,因为我已经弄明白了。但是为什么你认为这需要一个问答?从输出中是否有不清楚的地方,即
[日期:…]
“…”
?@jornsharpe不同,以便记录我的解决方案,并为其他人节省几分钟时间。没有比这更基本的了。你在哪里看到了这种问答的害处?我想我看不出任何人搜索和找到它的速度比他们阅读测试输出的速度更快。
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);
});