【发布时间】:2020-04-17 09:52:07
【问题描述】:
我正在编写一个 Jest 测试,其中我调用一个函数并期望返回一个对象,如下所示:
const repository = container => {
const makeBooking = (user, booking) => {
'make booking function called'
}
const generateTicket = (paid, booking) => {
console.log('generate ticket function called')
}
const getOrderById = orderId => {
console.log('get order by ID called')
}
const disconnect = () => {
console.log('disconnect method called')
}
return {
makeBooking,
getOrderById,
generateTicket,
disconnect
}
}
为了举例,所有这些函数现在都是示例。我现在,导出函数,然后在测试中使用它,如下所示:
container = {}
describe('Repository', () => {
it('should connect with a container', () => {
let hello = repository(container)
expect(hello).toMatchObject({
makeBooking: jest.fn('makeBooking'),
getOrderById: jest.fn('getOrderById'),
generateTicket: jest.fn('generateTicket'),
disconnect: jest.fn('disconnect')
})
})
})
我得到的错误是:
Expected value to match object:
{"disconnect": [Function mockConstructor], "generateTicket": [Function mockConstructor], "getOrderById": [Function mockConstructor], "makeBooking": [Function mockConstructor]}
Received:
{"disconnect": [Function disconnect], "generateTicket": [Function generateTicket], "getOrderById": [Function getOrderById], "makeBooking": [Function makeBooking]}
我需要模拟从存储库对象返回的对象。但是,该对象由代码中所示的命名函数组成。 有没有办法模拟里面有函数的对象?
【问题讨论】:
-
我不清楚您要模拟什么 - 如果您正在测试
repository.connect,您不应该模拟其中的内容。如果你只关心你可以做的形状,例如expect(hello).toMatchObject({ makeBooking: expect.anything(), ... });,但在某些时候你也应该测试这些功能。 -
我上面粘贴的代码有一个小错误。我不是在模拟连接,我是在模拟存储库对象的返回对象。
-
Expect.anything() 正在工作,但无论如何我可以确定它们确实是函数吗?
-
不过,您没有显示任何模拟设置;目前尚不清楚您为什么认为此测试可能会通过。我认为您可以使用
expect.any(Function),但这似乎不是一种可靠的测试方法。 -
本单元的范围,原子测试只是测试存储库,它实际上是一个适配器,一旦被调用,是否会提供必要的存储库对象。这些存储库功能的实现将在其他地方进行测试;不在这里。我希望你明白。感谢您的帮助。
标签: javascript node.js unit-testing jestjs jest-fetch-mock