nie*_*s_h 2 mongoose mongodb typescript jestjs
我对我的猫鼬模型进行了测试,虽然一个模型的测试运行完全正常,但另一个模型基本上是一个副本 - 不起作用。老实说我不明白这个问题。我尝试删除一些属性或添加硬编码值以真正 100% 完全匹配 - 但不知何故我总是遇到类似的错误。
\n\n错误。让我发疯的是,我尝试删除/添加“_id”和“createdOn”字段,但至少“_id”总是出现在错误中。正如上面在另一个模型中所说,测试不会抱怨“_id”,因为我没有在那里验证它......我只是不明白它。
\n\ninsert \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)\nRun Code Online (Sandbox Code Playgroud)\n\n对应型号
\n\nimport 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);\nRun Code Online (Sandbox Code Playgroud)\n\n考试:
\n\nit("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 });\nRun Code Online (Sandbox Code Playgroud)\n
仅供参考,我发现了某事。返回的猫鼬对象应该使用“.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)