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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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 笑话模拟不可命名拾取错误抛出?_Javascript_Unit Testing_Mocking_Jestjs - Fatal编程技术网

Javascript 笑话模拟不可命名拾取错误抛出?

Javascript 笑话模拟不可命名拾取错误抛出?,javascript,unit-testing,mocking,jestjs,Javascript,Unit Testing,Mocking,Jestjs,我有一些调用api的代码。我正在测试try-catch中嵌套的功能,并检查在抛出带有特定值的错误时是否发生了正确的行为 async function createDeployment(namespace, config, name) { try { await k8sDeploymentApi.createNamespacedDeployment(namespace, config, true); console.log('Successful deployment');

我有一些调用api的代码。我正在测试try-catch中嵌套的功能,并检查在抛出带有特定值的错误时是否发生了正确的行为

async function createDeployment(namespace, config, name) {
  try {
    await k8sDeploymentApi.createNamespacedDeployment(namespace, config, true);
    console.log('Successful deployment');
    return Promise.resolve(true);
  } catch (e) {
    console.log(JSON.stringify(e));
    if (e.response.statusCode === HTTP_CONFLICT) {
      try {
        await k8sDeploymentApi.replaceNamespacedDeployment(name, namespace, config, true);
        console.log('Successfully replaced deployment');
        return Promise.resolve(true);
      } catch (error) {
        return Promise.reject(error);
      }
    }
    return Promise.reject(e);
  }
}
我在这里模拟api调用节点模块

var mockListNamespacedIngress;
var mockCreateNamespacedDeployment;
var mockReplaceNamespacedDeployment;
jest.mock('@kubernetes/client-node', () => {
  mockListNamespacedIngress = jest.fn();
  mockCreateNamespacedDeployment = jest.fn();
  mockReplaceNamespacedDeployment = jest.fn();
  return {
    KubeConfig: jest.fn().mockImplementation(() => ({
      loadFromCluster: jest.fn(),
      loadFromDefault: jest.fn(),
      makeApiClient: () => ({
        listNamespacedIngress: mockListNamespacedIngress,
        createNamespacedDeployment: mockCreateNamespacedDeployment,
        replaceNamespacedDeployment: mockReplaceNamespacedDeployment,
      }),
    })),
  };
});
在这里运行测试

    it.only('Should return a log of success if replaced deployment resolves', async () => {
      mockCreateNamespacedDeployment.mockRejectedValueOnce(() =>
        Promise.reject(new Error({ response: { statusCode: 409 } })),
      );

      mockReplaceNamespacedDeployment.mockResolvedValueOnce(true);

      // When
      await expect(createDeployment()).resolves.toEqual(true);
    });
然而,在console.log(JSON.stringify(e))上,我只返回了未定义的内容。因此,它看起来确实抛出了错误,但没有从catch中给出错误对象。这是我的全部记录

 ● Kubernetes deployment script tests › Kubernetes Calls › Should return a log of success if replaced deployment resolves

    expect(received).resolves.toEqual()

    Received promise rejected instead of resolved
    Rejected to value: [TypeError: Cannot read property 'statusCode' of undefined]

      143 |
      144 |       // When
    > 145 |       await expect(createDeployment()).resolves.toEqual(true);
          |             ^
      146 |     });
      147 |   });
      148 |

      at expect (node_modules/expect/build/index.js:134:15)
      at Object.it.only (src/__tests__/index.test.js:145:13)

  console.log
    Successful deployment

      at createDeployment (src/index.js:73:13)

  console.log
    undefined

      at createDeployment (src/index.js:76:13)

您可以模拟一个异步函数抛出这样的错误

mockCreateNamespacedDeployment.mockRejectedValueOnce(new Error({ response: { statusCode: 409 } });
然后你可以期待

await expect(createDeployment()).rejects.toThrow();

顺便说一句,在
async
函数中,您可以替换所有

- Promise.resolve(xxx)
+ return xxx

// and
- Promise.reject(xxx)
+ throw xxx

当我这样做时,我仍然会得到console.log的'successful deployment',在catch(e)中创建的'e'变量中没有任何值,这与我正常运行代码时的情况相反,当createNamespacedDeployment出现错误时,它会以409 http状态代码进入catch。