Sinon как модульно протестировать функцию двойной стрелки в функции mysql2.createPool

#node.js #unit-testing #aws-lambda #amazon-rds #sinon

#node.js #модульное тестирование #aws-lambda #amazon-rds #sinon

Вопрос:

У меня есть класс подключения, используемый для установления соединения с экземпляром базы данных AWS RDS Aurora. Класс работает нормально, но у меня возникли проблемы с получением полного покрытия модульным тестированием. Есть одна часть, которую я не уверен, как охватить. Это mysql_clear_password: () => () => Buffer.from(this.options.password '') показано в классе подключения ниже. Как я могу охватить эту конкретную строку? Необходим ли рефакторинг функции?

Я попытался переместить Buffer функцию в отдельную функцию, но отчет о покрытии по-прежнему показывает, что исходная строка не обнаружена

Класс подключения:

 const mysql2 = require('mysql2/promise');

class Connection {
    constructor(options = {}) {
        this.options = options;
    }

    createPool () {
        this.pool = mysql2.createPool({
            host: this.options.host,
            user: this.options.user,
            database:  'my_db',
            ssl: 'Amazon RDS',
            password: this.options.password,
            authPlugins: {
                mysql_clear_password: () => () => Buffer.from(this.options.password   '')
            }
        });
    }
}
module.exports = { Connection };
  

Вот что у меня есть до сих пор в моем тесте:

 const conns = require('../src/connection');
const sinon = require('sinon');
const mysql2 = require('mysql2/promise');

    describe('connection', () => {
         afterEach(() => {
           sinon.restore();
        });
    
        test('Test creatPool function from connection class', async () => {
            const options = {
                host: 'testHost',
                user: 'testUser',
                password: 'testPassword'
            };
    
            const createPoolStub = sinon.stub(mysql2, 'createPool').returns(sinon.stub().returnsThis());
            const conn = new conns.Connection(options);
            await conn.createPool();
            sinon.assert.calledOnce(createPoolStub);
        });
    });
  

Ответ №1:

Используя stub.callsFake метод, чтобы заставить stub( mysql2.createPool ) вызывать предоставленную функцию при вызове. Затем вы можете получить mysql_clear_password метод из предоставленной функции в вашем тестовом примере.

Например.

connection.js :

 const mysql2 = require('mysql2/promise');

class Connection {
  constructor(options = {}) {
    this.options = options;
  }

  createPool() {
    this.pool = mysql2.createPool({
      host: this.options.host,
      user: this.options.user,
      database: 'my_db',
      ssl: 'Amazon RDS',
      password: this.options.password,
      authPlugins: {
        mysql_clear_password: () => () => Buffer.from(this.options.password   ''),
      },
    });
  }
}
module.exports = { Connection };
  

connection.test.js :

 const mysql2 = require('mysql2/promise');
const conns = require('./connection');
const sinon = require('sinon');
const { expect } = require('chai');

describe('64300458', () => {
  it('Test creatPool function from connection class', () => {
    const options = {
      host: 'testHost',
      user: 'testUser',
      password: 'testPassword',
    };

    let configRef;
    const createPoolStub = sinon.stub(mysql2, 'createPool').callsFake((config) => {
      configRef = config;
    });

    const conn = new conns.Connection(options);
    conn.createPool();
    sinon.assert.calledOnce(createPoolStub);

    // test mysql_clear_password
    const actual = configRef.authPlugins.mysql_clear_password()();
    expect(actual).to.be.eql(Buffer.from('testPassword'));
    createPoolStub.restore();
  });
});
  

результат модульного тестирования с отчетом о покрытии:

   64300458Test creatPool function from connection class


  1 passing (11ms)

---------------|---------|----------|---------|---------|-------------------
File           | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
---------------|---------|----------|---------|---------|-------------------
All files      |     100 |        0 |     100 |     100 |                   
 connection.js |     100 |        0 |     100 |     100 | 4                 
---------------|---------|----------|---------|---------|-------------------