0

我需要开玩笑地为一个函数编写一个测试。我的功能如下:

async function fun(conn, input){
    const connection = conn.getConnection();
    ....
    // some output gets generated from input 
    // const processed_input = input???;
    ....
    const x = util.promisify(connection.query).bind(connection);
    return /* await */ x(processed_input);
}

我希望将其值processed_input传递给 function x

我认为类似的东西.toHaveBeenCalledWith应该可以工作我不确定它如何用于承诺的绑定函数。

我还尝试conn.getConnection = { query: jest.fn() }在通话之前模拟查询,fun但我不确定如何继续进行expect

更新:到目前为止,我目前的解决方案是expect在查询函数中包含 jest 语句。

conn.getConnection = {
 query: function(processed_input){ //expect processed_input to be; } 
}`

希望有更好的方法。

4

1 回答 1

1

connection.query是 Nodejs 错误优先回调,您需要模拟它的实现并使用模拟的错误或数据手动调用错误优先回调。

除非您需要绑定上下文,否则您不需要它。从您的问题来看,我认为不需要绑定上下文。

例如

func.js

const util = require('util');

async function fun(conn, input) {
  const connection = conn.getConnection();
  const processed_input = 'processed ' + input;
  const x = util.promisify(connection.query).bind(connection);
  return x(processed_input);
}

module.exports = fun;

func.test.js

const fun = require('./func');

describe('67774122', () => {
  it('should pass', async () => {
    const mConnection = {
      query: jest.fn().mockImplementation((input, callback) => {
        callback(null, 'mocked query result');
      }),
    };
    const mConn = {
      getConnection: jest.fn().mockReturnValueOnce(mConnection),
    };
    const actual = await fun(mConn, 'input');
    expect(actual).toEqual('mocked query result');
    expect(mConn.getConnection).toBeCalledTimes(1);
    expect(mConnection.query).toBeCalledWith('processed input', expect.any(Function));
  });
});

测试结果:

 PASS  examples/67774122/func.test.js (7.015 s)
  67774122
    ✓ should pass (4 ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |     100 |      100 |     100 |     100 |                   
 func.js  |     100 |      100 |     100 |     100 |                   
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        7.52 s
于 2021-06-01T05:06:35.283 回答