如何使用 jest 来监视 Schema.virtual 的猫鼬?
Posted
技术标签:
【中文标题】如何使用 jest 来监视 Schema.virtual 的猫鼬?【英文标题】:How to use jest to spy on Schema.virtual of mongoose? 【发布时间】:2020-11-12 19:24:45 【问题描述】:我已经定义了一个 mongoose Schema,如何监视 Schema 并确保在我的单元测试中调用了 virtual
方法。
const UserSchema = new Schema(
username: SchemaTypes.String,
password: SchemaTypes.String,
email: SchemaTypes.String,
firstName: type: SchemaTypes.String, required: false ,
lastName: type: SchemaTypes.String, required: false ,
roles: [
type: SchemaTypes.String, enum: ['ADMIN', 'USER'], required: false ,
],
// createdAt: type: SchemaTypes.Date, required: false ,
// updatedAt: type: SchemaTypes.Date, required: false ,
,
timestamps: true,
toJSON:
virtuals: true
,
);
UserSchema.virtual('name').get(function ()
return `$this.firstName $this.lastName`;
);
UserSchema.virtual('posts',
ref: 'Post',
localField: '_id',
foreignField: 'createdBy',
);
【问题讨论】:
【参考方案1】:我找到了一个简单的解决方案来解决这个问题,但我必须重构我的代码。
将虚方法提取为独立函数。
function nameGetHook()
return `$this.firstName $this.lastName`;
UserSchema.virtual('name').get(nameGetHook);
并设置一个模拟上下文以开玩笑地运行该函数。
const getMock = jest.fn().mockImplementationOnce(cb => cb)
const virtualMock = jest.fn().mockImplementationOnce(
(name: string) => (
get: getMock
)
);
describe('UserSchema', () =>
it('should called Schame.virtual ', () =>
expect(UserSchema).toBeDefined()
expect(getMock).toBeCalled()
expect(getMock).toBeCalledWith(anyFunction())
expect(virtualMock).toBeCalled()
expect(virtualMock).toHaveBeenNthCalledWith(1, "name")
expect(virtualMock).toHaveBeenNthCalledWith(2, "posts", "foreignField": "createdBy", "localField": "_id", "ref": "Post" )
expect(virtualMock).toBeCalledTimes(2)
);
);
...
查看我的完整示例代码here。
【讨论】:
以上是关于如何使用 jest 来监视 Schema.virtual 的猫鼬?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Jest 在 NestJS 的提供者中模拟和监视“mongoose.connect”
如何同时观看运行 Jest 测试的 webpack-dev-server?