为了账号安全,请及时绑定邮箱和手机立即绑定

无法模拟 Promise 函数

无法模拟 Promise 函数

qq_笑_17 2023-10-20 16:12:06
我有以下 lambda (aws) 代码:exports.APILambda = (databaseConnection) => {  return function (event, context, callback) {    context.callbackWaitsForEmptyEventLoop = false    const connection = databaseConnection()    connection.then((connection, query, args) => {      connection.query(queries(query, args), args)        .then(result => {          console.log(result)          connection.end()          callback(null, { data: result })        })        .catch(err => {          throw err        })    })      .catch(err => {        logger.error(`${err.stack}`)        callback(err)      })  }}databaseConnection是一个 mariaDb 连接,实现为:function databaseConnection () {  return mariadb.createConnection({    host: process.env.DB_HOST,    user: process.env.DB_USER,    password: process.env.DB_PASSWORD,    port: '3306',    database: 'test'  })}我的测试是:describe('on new query', () => {  it('returns data', async (done) => {    await runLambda(      ['person', ['John']],      (query) => {        expect(query).toHaveBeenCalledWith(          expect.arrayContaining(['person', ['John']])        )      }, done)  })})对于该测试,我必须编写以下函数:async function runLambda (args, assertions, done) {  const query = jest.fn(args => {    return Promise.resolve({      'name': 'John',      'lastName': 'Wayne'    })  })  const onNewQuery = APILambda(async () => ({ query }))  const event = {}  const context = {}  await onNewQuery(    event,    context,    (err, result) => {      if (err) done(err)      assertions(query)      done(result)    }  )}但是当我运行它时我遇到了麻烦,它不断抛出:TypeError: connection.end is not a function或者说args未定义。有人可以阐明如何正确地嘲笑这一点吗?
查看完整描述

1 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

您的代码存在很多问题:

  1. 您应该为connection.end()方法创建模拟。

  2. 你不应该将成功的结果传递给done()回调

  3. 您应该返回一个数组来解析 的多个值connection.then()

  4. 你没有提供queries函数,所以我直接传递queryandargs参数。

  5. 你传了args参数,但是你没有使用它,我下面根据代码的意思使用它

一个工作示例:

testUtils.js:

const { APILambda } = require('./apiLambda');

// 5. You passed `args` parameter, but you didn't use it, I use it below based on the meaning of code

async function runLambda(args, assertions, done) {

  const query = jest.fn(() => {

    return Promise.resolve({

      name: 'John',

      lastName: 'Wayne',

    });

  });

  // 1. create mock for `connection.end()` method.

  const end = jest.fn();


  // 3. You should return an array to resolve multiple values for connection.then()

  const onNewQuery = APILambda(async () => [{ query, end }, args, null]);


  const event = {};

  const context = {};

  await onNewQuery(event, context, (err, result) => {

    if (err) done(err);

    assertions(query);

    // 2. you should NOT pass successful result to done() callback

    done();

  });

}


module.exports = { runLambda };

apiLambda.js:


exports.APILambda = (databaseConnection) => {

  return function(event, context, callback) {

    context.callbackWaitsForEmptyEventLoop = false;


    const connection = databaseConnection();


    connection

      .then(([connection, query, args]) => {

        connection

          // 4. You didn't provide `queries` function, so I just pass `query` and `args` parameters directly.

          .query(query, args)

          .then((result) => {

            console.log(result);

            connection.end();

            callback(null, { data: result });

          })

          .catch((err) => {

            throw err;

          });

      })

      .catch((err) => {

        console.error(`${err.stack}`);

        callback(err);

      });

  };

};

apiLambda.test.js:


const { runLambda } = require('./testUtils');


describe('on new query', () => {

  it('returns data', async (done) => {

    await runLambda(

      ['person', ['John']],

      (query) => {

        expect(query).toHaveBeenCalledWith(['person', ['John']], null);

      },

      done,

    );

  });

});

单元测试结果:


 PASS  src/stackoverflow/65179710/apiLambda.test.js (9.195s)

  on new query

    ✓ returns data (16ms)


  console.log src/stackoverflow/65179710/apiLambda.js:341

    { name: 'John', lastName: 'Wayne' }


--------------|----------|----------|----------|----------|-------------------|

File          |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |

--------------|----------|----------|----------|----------|-------------------|

All files     |    85.19 |       50 |    81.82 |     87.5 |                   |

 apiLambda.js |       75 |      100 |    66.67 |       75 |          18,22,23 |

 testUtils.js |    93.33 |       50 |      100 |      100 |                19 |

--------------|----------|----------|----------|----------|-------------------|

Test Suites: 1 passed, 1 total

Tests:       1 passed, 1 total

Snapshots:   0 total

Time:        10.556s


查看完整回答
反对 回复 2023-10-20
  • 1 回答
  • 0 关注
  • 46 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信