Javascript 如何在jest测试中模拟外部函数调用
下面是要测试的Node.js模块(userdata.js文件): 和测试文件:Javascript 如何在jest测试中模拟外部函数调用,javascript,node.js,unit-testing,jestjs,Javascript,Node.js,Unit Testing,Jestjs,下面是要测试的Node.js模块(userdata.js文件): 和测试文件: const UserData = require('/.userdata') test('UserData.getData', () => { expect(UserData.getData('John Smith')).toBe('John\' manager'); }); 我想模拟myService.getUserData和/或myService.getManagerData函数调用,我没有在测试文件
const UserData = require('/.userdata')
test('UserData.getData', () => {
expect(UserData.getData('John Smith')).toBe('John\' manager');
});
我想模拟myService.getUserData和/或myService.getManagerData函数调用,我没有在测试文件中直接声明这些函数。。如何正确地模拟它们以返回一些伪结果?您可以使用它为myService.getUserData
和myService创建存根。getManagerData方法
例如
userData.js
:
constmyservice=require('./myService');
类用户数据{
获取数据(查询){
返回新承诺((解决、拒绝)=>{
getUserData(查询)。然后((userdata)=>{
getManagerData(用户数据)。然后((managerdata)=>{
解析(managerdata);
});
});
});
}
}
module.exports=用户数据;
myService.js
:
const myService={
getUserData(查询){
返回“真实用户数据”;
},
getManagerData(用户数据){
返回“真实经理数据”;
},
};
module.exports=myService;
userData.test.js
:
constuserdata=require('./UserData');
const myService=require('./myService');
描述('61784452',()=>{
之后(()=>{
开玩笑。恢复记忆();
});
它('should pass',async()=>{
jest.spyOn(myService,'getUserData').mockResolvedValueOnce('fake user data');
jest.spyOn(myService,'getManagerData').mockResolvedValueOnce('fake manager data');
const userData=new userData();
const actual=await userData.getData('query');
expect(实际).toEqual(“假经理数据”);
expect(myService.getUserData).toBeCalledWith('query');
期望(myService.getManagerData).toBeCalledWith('false user data');
});
});
单元测试结果和覆盖率报告:
PASS stackoverflow/61784452/userData.test.js(12.908s)
61784452
✓ 应通过(5ms)
--------------|---------|----------|---------|---------|-------------------
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s
--------------|---------|----------|---------|---------|-------------------
所有文件| 84.62 | 100 | 71.43 | 84.62 |
myService.js | 50 | 100 | 0 | 50 | 3-6
userData.js | 100 | 100 | 100 | 100 |
--------------|---------|----------|---------|---------|-------------------
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:13.99秒
您可以使用为myService.getUserData
和myService创建存根。getManagerData方法
例如
userData.js
:
constmyservice=require('./myService');
类用户数据{
获取数据(查询){
返回新承诺((解决、拒绝)=>{
getUserData(查询)。然后((userdata)=>{
getManagerData(用户数据)。然后((managerdata)=>{
解析(managerdata);
});
});
});
}
}
module.exports=用户数据;
myService.js
:
const myService={
getUserData(查询){
返回“真实用户数据”;
},
getManagerData(用户数据){
返回“真实经理数据”;
},
};
module.exports=myService;
userData.test.js
:
constuserdata=require('./UserData');
const myService=require('./myService');
描述('61784452',()=>{
之后(()=>{
开玩笑。恢复记忆();
});
它('should pass',async()=>{
jest.spyOn(myService,'getUserData').mockResolvedValueOnce('fake user data');
jest.spyOn(myService,'getManagerData').mockResolvedValueOnce('fake manager data');
const userData=new userData();
const actual=await userData.getData('query');
expect(实际).toEqual(“假经理数据”);
expect(myService.getUserData).toBeCalledWith('query');
期望(myService.getManagerData).toBeCalledWith('false user data');
});
});
单元测试结果和覆盖率报告:
PASS stackoverflow/61784452/userData.test.js(12.908s)
61784452
✓ 应通过(5ms)
--------------|---------|----------|---------|---------|-------------------
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s
--------------|---------|----------|---------|---------|-------------------
所有文件| 84.62 | 100 | 71.43 | 84.62 |
myService.js | 50 | 100 | 0 | 50 | 3-6
userData.js | 100 | 100 | 100 | 100 |
--------------|---------|----------|---------|---------|-------------------
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:13.99秒
你试过开玩笑吗?
试过了。但问题是如何正确地做到这一点。。若我在测试文件中导入myService并在那个里模拟它,那个么它真的能在userData调用中工作吗?我如何在并没有导入myService的测试文件中模拟myService.getUserData。如果导入并模拟,它会工作吗?因为它本身在UserData模块中没有模拟。您是否尝试过jest.mock()
?我尝试过。但问题是如何正确地做到这一点。。若我在测试文件中导入myService并在那个里模拟它,那个么它真的能在userData调用中工作吗?我如何在并没有导入myService的测试文件中模拟myService.getUserData。如果导入并模拟,它会工作吗?因为它在UserData模块本身中没有模拟
const UserData = require('/.userdata')
test('UserData.getData', () => {
expect(UserData.getData('John Smith')).toBe('John\' manager');
});