我正在尝试模拟数据库调用,但由于某种原因它不起作用。如果我删除 .lean() 它的工作发现。
我如何嘲笑这个精益()
下面是我的代码
服务.js
function getStoreData(storeId, callback) {
global.models.Config.TransactionCashmgmtConfigModel.findOne({ storeId: storeId }).lean().exec((err, doc) => {
if (!doc || err) {
console.error('Error fetching document:', err);
return callback(err, false);
}
console.log('Document found:', doc);
return callback(null, true);
});
}
测试.js
global.models = {
Config: {
TransactionCashmgmtConfigModel: {
findOne: jest.fn()
},
},
};
describe('getStoreData', () => {
it('should return store data', () => {
const mockData = {storeId: '1234', enabled: true};
global.models.Config.TransactionCashmgmtConfigModel.findOne.mockImplementation(() => {
return {
exec: (callback) => {
callback(null, mockData);
},
};
});
getStoreData('1234', (err, data) => {
expect(data).toEqual(mockData)
});
});
});
您可以使用 mockFn.mockReturnThis() 来模拟链式方法调用。
从测试的断言可以看出,应该是
callback(null, doc)
,而不是callback(null, true)
您忘记调用
done()
,请参阅asynchronous#callbacks
例如
service.js
:
function getStoreData(storeId, callback) {
global.models.Config.TransactionCashmgmtConfigModel.findOne({ storeId: storeId })
.lean()
.exec((err, doc) => {
if (!doc || err) {
console.error('Error fetching document:', err);
return callback(err, false);
}
console.log('Document found:', doc);
return callback(null, doc);
});
}
module.exports = getStoreData;
service.test.js
:
const getStoreData = require('./service');
describe('getStoreData', () => {
it('should return store data', (done) => {
const mockData = { storeId: '1234', enabled: true };
global.models = {
Config: {
TransactionCashmgmtConfigModel: {
findOne: jest.fn().mockReturnThis(),
lean: jest.fn().mockReturnThis(),
exec: jest.fn().mockImplementation((callback) => {
callback(null, mockData);
}),
},
},
};
getStoreData('1234', (err, data) => {
expect(data).toEqual(mockData);
done();
});
});
});
测试结果:
console.log
Document found: { storeId: '1234', enabled: true }
at log (stackoverflow/78278897/service.js:9:15)
PASS stackoverflow/78278897/service.test.js
getStoreData
√ should return store data (18 ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 0.753 s, estimated 7 s
Ran all test suites related to changed files.