Node.js Jest/Node Axios测试抛出错误

Node.js Jest/Node Axios测试抛出错误,node.js,jestjs,axios,axios-mock-adapter,Node.js,Jestjs,Axios,Axios Mock Adapter,在使用lambda/node代码运行Jest测试时遇到问题。当我运行index.js时,Axios get工作正常 这是我的index.js const sslRootCAs = require('ssl-root-cas/latest') const util = require('util') exports.handler = async function (event) { const axios = require('axios'); //const user =

在使用lambda/node代码运行Jest测试时遇到问题。当我运行index.js时,Axios get工作正常

这是我的index.js

const sslRootCAs = require('ssl-root-cas/latest')
const util = require('util')

exports.handler = async function (event) {  
    const axios = require('axios');
    //const user = process.env.user;
    //const pw = process.env.pw;    
    const user = '';
    const pw = '';
    process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
    return axios.get('https://url', {
        auth: {username: user, password: pw}, rejectUnauthorized: false
    })
        .then(res => {
            return {
                statusCode: 200,
                body: res.data
            };
        })
        .catch(err => {
            return {
                statusCode: 500,
                body: JSON.stringify(err)
            };
        });
}
这是我的index.test.js

const lambda = require("./index");
const axios = require("axios");
const mockAdapter = require("axios-mock-adapter");

// afterEach(() => {
//   mockAxios.reset();
// });

    it("test get - this will pass", async () => {
      let mock = new mockAdapter(axios, {delayResponse: 1000});
      mock.onGet().reply({
        status: 200,
        data: {
          expand: 'schema,names',
          startAt: 0,
          maxResults: 50,
          total: 2
        }
      });
      process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
      var event = {Key: "12345"};
      const result = await lambda.handler(event);
      console.log(result);
      expect(result).toMatchObject({ status: 200, body: "test" });
      mock.reset();
    });
我用index.test.js尝试了多种方法。我甚至停止了所有的嘲弄,正在测试get是否有效。事实并非如此。当我运行npm测试时,我得到“无法验证第一个证书”

当我执行node index.js时,代码不会抛出该错误。我怀疑jest有某种类型的内置错误处理程序,或者Axios

任何想法都很好

谢谢,
蒂姆

我会从搬家开始

    const axios = require('axios');
在函数调用之外。运行测试时,我怀疑发生了以下情况:

  • 导入axios适配器
  • 你可以用MockAdapter来模拟它
  • 你叫你的lambda处理器
  • lambda处理程序使用它导入的axios处理程序,而不是您模拟的处理程序
  • 请求失败,因为jest阻止了它
  • Axios有一个名为create()的强大函数,可以创建一个实例(请参见:)。我通常为我将在应用程序中使用的所有端点创建一个单独的实例,然后从单独的文件中导出这些端点。这使得重用逻辑和模拟端点变得容易。例如,您可以创建一个只包含以下代码的文件api.js

    api.js 然后在index.js/handler中

    index.js 此外,如果您使用的是async Wait,则可以删除.then和.catch。这是处理承诺的两种不同方法。最好选择一个并坚持下去

    这样更干净,更容易阅读

    然后,在任何调用lambda的函数中(就像您的测试一样),您都可以执行以下操作:

      const result = await lambda.handler(event);
      expect(result).toMatchObject({ status: 200, body: "test" });
    
    对于代码中的其他位置,您可以通过将所有内容包装在try/catch中来处理调用函数中的响应代码设置,如下所示:

    try {
      const result = await lambda.handler(event);
      res.json(result.body);
    catch (e) {
      res.status(500).send({error: e})
     }
    
    test.js 然后,您应该通过以下操作将模拟适配器连接到您创建的axios实例:

    const lambda = require("./index");
    const api = require("./api");
    const mockAdapter = require("axios-mock-adapter");
    
    it("test get - this will pass", async () => {
      let mock = new mockAdapter(api, {delayResponse: 1000});
      mock.onGet('/').reply({ // make sure to specify the route your're mocking
        status: 200,
        data: {
          expand: 'schema,names',
          startAt: 0,
          maxResults: 50,
          total: 2
        }
      });
      process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
      var event = {Key: "12345"};
      const result = await lambda.handler(event);
      console.log(result);
      expect(result).toMatchObject({ status: 200, body: "test" });
      mock.reset();
    });
    

    感谢您的详细回答,非常感谢!!!!
    try {
      const result = await lambda.handler(event);
      res.json(result.body);
    catch (e) {
      res.status(500).send({error: e})
     }
    
    const lambda = require("./index");
    const api = require("./api");
    const mockAdapter = require("axios-mock-adapter");
    
    it("test get - this will pass", async () => {
      let mock = new mockAdapter(api, {delayResponse: 1000});
      mock.onGet('/').reply({ // make sure to specify the route your're mocking
        status: 200,
        data: {
          expand: 'schema,names',
          startAt: 0,
          maxResults: 50,
          total: 2
        }
      });
      process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
      var event = {Key: "12345"};
      const result = await lambda.handler(event);
      console.log(result);
      expect(result).toMatchObject({ status: 200, body: "test" });
      mock.reset();
    });