Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在jest测试中模拟节点模块_Javascript_Unit Testing_Testing_Jestjs - Fatal编程技术网

Javascript 在jest测试中模拟节点模块

Javascript 在jest测试中模拟节点模块,javascript,unit-testing,testing,jestjs,Javascript,Unit Testing,Testing,Jestjs,我正在为一个函数编写一个Jest测试,该函数调用API。如果API调用返回403,则应调用节点模块中的函数。我试图用一个mock jest函数来测试它,但是我无法让测试使用我正在制作的模块的模拟版本 file.spec.js import file from './file' const mockedNodeModule = jest.genMockFromModule('nodeModule') mockedNodeModule.namedExport = { logout: jest.fn

我正在为一个函数编写一个Jest测试,该函数调用API。如果API调用返回403,则应调用节点模块中的函数。我试图用一个mock jest函数来测试它,但是我无法让测试使用我正在制作的模块的模拟版本

file.spec.js

import file from './file'

const mockedNodeModule = jest.genMockFromModule('nodeModule')
mockedNodeModule.namedExport = { logout: jest.fn() }

it('call returns a 403', async () => {
      await file.apiCall('brand', 'entityType', 'name')
      expect(mockedNodeModule.namedExport.logout).toHaveBeenCalled()
})
file.js

import { namedExport } from './nodeModule';
import api from './api';

const apiCall = () => {
  return api.makeCall().then(
    () => {},
    (error) => {
      if (error.status === 403) {
        namedExport.logout();
      }
    },
  );
};

export default { apiCall };
当我检查是否调用了mockedNodeModule.namedExport.logout时,测试总是失败。当我将断点放在调用它的行上时,似乎在测试运行时没有使用模拟版本(即,它仍在使用我的node_modules中的模块)。我也尝试过使用jest.mock(),但结果是一样的。我设置测试的方式是否有问题?在这种情况下,jest不能模拟节点模块吗?

应该可以

例如

file.js

从“/nodeModule”导入{namedExport};
从“/api”导入api;
常量apiCall=()=>{
返回api.makeCall()。然后(
() => {},
(错误)=>{
如果(error.status==403){
namedExport.logout();
}
},
);
};
导出默认值{apiCall};
api.js

函数makeCall(){}
导出默认值{makeCall};
nodeModule.js

导出常量namedExport={
注销(){
log('real implementation');
},
};
file.test.js

从“/file”导入文件;
从“/api”导入api;
从“./nodeModule”导入{namedExport};
jest.mock('./nodeModule',()=>{
常量mNamedExport={
注销:jest.fn(),
};
返回{namedExport:mNamedExport};
});
jest.mock('./api',()=>{
返回{makeCall:jest.fn()};
});
描述('59831697',()=>{
之后(()=>{
开玩笑。clearAllMocks();
});
它('如果http状态等于403,则应处理错误',异步()=>{
const mError={状态:403};
api.makeCall.mockRejectedValueOnce(mError);
等待文件.apiCall();
预期(namedExport.logout).已被调用的时间(1);
});
});
单元测试结果和覆盖率报告:

PASS src/stackoverflow/59831697/file.test.js(13.506s)
59831697
✓ 如果http状态等于403(7ms),则应处理错误
----------|----------|----------|----------|----------|-------------------|
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s|
----------|----------|----------|----------|----------|-------------------|
所有文件| 100 | 50 | 66.67 | 100 ||
file.js | 100 | 50 | 66.67 | 100 | 8|
----------|----------|----------|----------|----------|-------------------|
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:15.448秒

源代码:

您正在生成一个模拟,但实际上并没有在任何地方使用它。@jornsharpe感谢您的回复。当我使用jest.mock模拟我自己的模块时,这些模块会在我运行测试时自动使用(但如果它是节点模块则不会)。当我在测试中设置断点时,我可以看到它正在使用我的模拟模块。jest.genMockFromModule不是这样吗?我希望在file.js中,当调用namedExport.logout时,它将使用我使用genMockFromModule创建的模拟模块中定义的一个!这么长时间以来,我一直在试图找出我做错了什么。非常感谢。