Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.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 在node.js中导入运行单元测试的函数时为只读_Javascript_Node.js_Axios_Jestjs - Fatal编程技术网

Javascript 在node.js中导入运行单元测试的函数时为只读

Javascript 在node.js中导入运行单元测试的函数时为只读,javascript,node.js,axios,jestjs,Javascript,Node.js,Axios,Jestjs,我试着在Jest中模拟一个异步函数,我使用了mockResolvedValue,如文档所示。但我遇到了只读问题,我的模拟函数是从其他地方导入的,我的代码如下: //index.js async function getUser(id) { const user = await axios.get('./user') return user } module.exports = { getUser } 如果要测试getUser函数,应该模拟axios.get方法及其

我试着在Jest中模拟一个异步函数,我使用了mockResolvedValue,如文档所示。但我遇到了只读问题,我的模拟函数是从其他地方导入的,我的代码如下:

//index.js 
async function getUser(id) { 
    const user = await axios.get('./user') 
    return user
}
module.exports = {
    getUser
}

如果要测试
getUser
函数,应该模拟
axios.get
方法及其返回值。使用方法手动模拟axios模块

例如

index.js

const axios=require('axios');
异步函数getUser(id){
const user=wait axios.get('./user');
返回用户;
}
module.exports={
getUser,
};
index.spec.js

从“axios”导入axios;
从“/”导入{getUser};
mock('axios',()=>{
返回{get:jest.fn()};
});
描述('64385009',()=>{
它('test getUser',async()=>{
const expectedUser=[{id:'1',name:'Alice'}];
axios.get.mockResolvedValueOnce(expectedUser);
const result=wait getUser();
期望(结果)。toEqual(期望者);
expect(axios.get).toBeCalledWith('./user');
});
});
单元测试结果:

 PASS  src/stackoverflow/64385009/index.spec.js
  ✓ test getUser (6ms)

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |      100 |      100 |      100 |                   |
 index.js |      100 |      100 |      100 |      100 |                   |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        5.27s, estimated 12s

那个测试似乎毫无意义,你似乎试图模拟你应该测试的东西,所以你最终会测试这个模拟。另外,你不需要开玩笑。mock,你应该看看,例如,我正在测试getUser函数,对吗?但是我不想直接攻击服务器,这是我的目标。然后你需要模拟
axios
,而不是整个
getUser
。您还可以查看,例如,
jest mock axios
。但是Axios是一个你不拥有的界面,所以通常最好不要嘲笑它——考虑在它周围有一个立面,将你的代码与Axios的变化隔离开来,然后模拟外观。或者,如果您有更高级别(例如,端到端)的测试会告诉您请求是否停止工作,那么可能根本不测试
getUser
。我有以下代码:
async function getUser(){//如果这里有多个调用呢?返回某物}
,我不应该测试getUser的结果吗?axios只是我用来从API中获取结果的一个库。我现在真的很困惑我该怎么办。如果
getUser
比您所展示的更复杂,那么它可能应该进行测试,您要么模拟axios,要么在axios周围提取一个外观并模拟它(因为,正如您所说,“axios只是我使用的一个库”-您不拥有它,以后可能想要更改它)。我们不能为您做出这样的判断。是的,但是在getUser函数中,在axios调用之后,我还有一些函数用于转换数据。如果我没有使用axios呢?说这是一个twitter包装库,我应该模拟包装库吗?@Ambrose对于单元测试,你应该模拟每个受影响的方法/函数,以使测试隔离。对于纯方法/函数,您通常不需要模拟它们,除非这些纯方法/函数的逻辑太复杂,您只需要得到一个简单的返回值。
 PASS  src/stackoverflow/64385009/index.spec.js
  ✓ test getUser (6ms)

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |      100 |      100 |      100 |                   |
 index.js |      100 |      100 |      100 |      100 |                   |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        5.27s, estimated 12s