在Jest中,应该使用哪种数据类型来期望日期值?

3
在我的测试中
    it("should list all tickets", async () => {
    const getTicket = await request(app)
        .get("/v1/ticket")
        .set("authorization", loginResponse.body.accessJWT);
    console.log(getTicket.body.result);
    console.log(getTicket.body.result[0].conversations);
    expect(getTicket.body.result).toEqual(
        expect.arrayContaining([
            expect.objectContaining({
                // _id: expect.any(String),
                // status: "pending response",
                openAt: expect.any(Date),
                conversations: expect.arrayContaining([
                    expect.objectContaining({
                        // sender: expect.any(String),
                        msgAt: expect.any(String),
                        // message: expect.any(String),
                    }),
                ]),
            }),
        ])
    );
});

});

我正在检查openAt和msgAt的值是否为日期值。但日期值以字符串形式保存,类似于:

"msgAt": "2021-12-22T08:29:15.038Z",

如何检查openAt的值是否为保存在字符串格式中的日期?

1
https://jestjs.io/docs/expect#expectstringmatchingstring--regexp? - jonrsharpe
但是我更加困惑的是为什么它无法将其视为非日期数据类型。 - b.p.
1
你的意思是什么?它不是一个“日期”,而是一个字符串。 - jonrsharpe
我以为Date是一种数据类型。所以我认为只有原始数据类型,如字符串、数字和布尔值才能在expect.any中使用? - b.p.
1
这取决于你所断言的内容。如果实际值是一个日期,expect.any(Date) 将完美地工作。但在这种情况下,它是一个字符串,显然不会起作用。JSON 只能表示基本类型,以及普通对象和数组。 - jonrsharpe
msgAt使用Date.now()的默认值,它应该是一个数字类型,但是当保存并从mongodb获取时,它以iso标准的字符串类型出现。如果expect.any()不接受数据库设置的标准日期,那么什么样的日期才是有效的?也许我可以将其更改为那种形式。 - b.p.
3个回答

2
可以按照以下方式进行检查。如果日期无效,则getTime函数返回NaN。
    expect(new Date(result.msgAt).getTime()).not.toBeNaN();

2
您可以尝试以下方法:

您可能只需执行以下操作:

expect(new Date(msgAt)).toBeInstanceOf(Date);

将返回值转换为日期并检查它是否为日期。如果该值不能转换为日期,则测试将失败。


3
"new Date('hello world') instanceof Date" 这个检查并不完全正确,因为它总是会返回 true。 - Ahmet Şimşek

1

你收到的类型是字符串。你可以使用正则表达式来强制实施特定模式。

但是,如果你期望接收的字符串可以被 Date 解析,你可以在该字符串上使用 parse 方法。如果参数表示的不是有效日期,则返回 NaN

expect(Date.parse(msgAt)).not.toBeNaN();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接