笑话 toMatchObject 与 MongoDB 混淆

nie*_*s_h 2 mongoose mongodb typescript jestjs

我对我的猫鼬模型进行了测试,虽然一个模型的测试运行完全正常,但另一个模型基本上是一个副本 - 不起作用。老实说我不明白这个问题。我尝试删除一些属性或添加硬编码值以真正 100% 完全匹配 - 但不知何故我总是遇到类似的错误。

\n\n

错误。让我发疯的是,我尝试删除/添加“_id”和“createdOn”字段,但至少“_id”总是出现在错误中。正如上面在另一个模型中所说,测试不会抱怨“_id”,因为我没有在那里验证它......我只是不明白它。

\n\n
insert \xe2\x80\xba Should save a channel\n\nexpect(received).toMatchObject(expected)\n\n- Expected  - 1\n+ Received  + 2\n\n@@ -1,8 +1,9 @@\n  Object {\n+   "_id": "5e962f1dc133d8b92891ddaf",\n    "createdBy": "5e962f1dc133d8b92891ddae",\n-   "createdOn": Anything,\n+   "createdOn": 2020-04-14T21:46:05.907Z,\n    "hasAcceptedLegal": false,\n    "isActive": true,\n    "isPublic": false,\n    "members": Array [\n      "5e962f1dc133d8b92891ddae",\n\n  48 |     expect(spy).toHaveBeenCalled();\n  49 | \n> 50 |     expect(channel).toMatchObject({\n     |                     ^\n  51 |       name: mockName,\n  52 |       createdBy: mockCreatedById,\n  53 |       createdOn: expect.anything(),\n\n  at Object.it (test/model/channel.model.test.ts:50:21)\n
Run Code Online (Sandbox Code Playgroud)\n\n

对应型号

\n\n
import mongoose, { Schema, Document } from "mongoose";\nimport { IUser } from "./user.model";\n\nexport interface IChannel extends Document {\n  name: string;\n  createdBy: IUser["id"];\n  createdOn: Date;\n  isActive: boolean;\n  isPublic: boolean;\n  hasAcceptedLegal: boolean;\n  members: [IUser["id"]];\n}\n\nconst ChannelSchema: Schema = new Schema({\n  name: { type: String, required: true },\n  createdBy: {\n    type: Schema.Types.ObjectId,\n    ref: "User",\n    required: true,\n  },\n  createdOn: { type: Date },\n  isActive: { type: Boolean, default: true },\n  isPublic: { type: Boolean, default: false },\n  hasAcceptedLegal: { type: Boolean, default: false },\n  members: [\n    {\n      type: Schema.Types.ObjectId,\n      ref: "User",\n      required: true,\n    },\n  ],\n});\n\nexport default mongoose.model<IChannel>("Channel", ChannelSchema);\n
Run Code Online (Sandbox Code Playgroud)\n\n

考试:

\n\n
it("Should save a channel", async () => {\n    expect.assertions(2);\n    let mockName = Faker.company.companyName();\n    let mockCreatedById = Types.ObjectId();\n    let mockCreatedOn = Date.now();\n\n    const channel: IChannel = new Channel({\n      name: mockName,\n      createdBy: mockCreatedById,\n      createdOn: mockCreatedOn,\n      members: [mockCreatedById],\n    });\n    const spy = jest.spyOn(channel, "save");\n    channel.save();\n\n    expect(spy).toHaveBeenCalled();\n\n    expect(channel).toMatchObject({\n      name: mockName,\n      createdBy: mockCreatedById,\n      createdOn: expect.anything(),\n      isActive: true,\n      isPublic: false,\n      hasAcceptedLegal: false,\n      members: [mockCreatedById],\n    });\n  });\n
Run Code Online (Sandbox Code Playgroud)\n

nie*_*s_h 5

仅供参考,我发现了某事。返回的猫鼬对象应该使用“.toJSON()”进行转换,然后它就可以工作,但即使这样,“createdOn”字段也有问题,因为它似乎是格式化的日期或其他东西。像这样(没有字符串,缺少括号)。我现在最终所做的是以下内容,现在它可以工作了:

it("Should save a channel (required+defaults)", async () => {
    expect.assertions(2);
    let mockName = Faker.company.companyName();
    let mockCreatedById = Types.ObjectId();
    let mockCreatedOn = new Date();

    const channel: IChannel = new Channel({
      name: mockName,
      createdBy: mockCreatedById,
      createdOn: mockCreatedOn,
      members: [mockCreatedById],
    });
    const spy = jest.spyOn(channel, "save");
    channel.save();

    expect(spy).toHaveBeenCalled();

    expect(channel.toJSON()).toMatchObject({
      _id: expect.anything(),
      name: mockName,
      createdBy: mockCreatedById,
      createdOn: expect.anything(),
      isActive: true,
      isPublic: false,
      hasAcceptedLegal: false,
      members: expect.arrayContaining([mockCreatedById]),
    });
  });
Run Code Online (Sandbox Code Playgroud)