Дразнящий serverless-mysql используя sinon - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь протестировать лямбда-функцию AWS (node.js), созданную с помощью AWS SAM. Моя функция использует модуль npm serverless-mysql для подключения к Авроре. Ниже приведены соответствующие части моей лямбда-функции:

const connection = require('serverless-mysql')({
    config: {
        host     : process.env.DB_HOST,
        user     : process.env.DB_USER,
        password : process.env.DB_PASSWORD
    }
});

exports.lambdaHandler = async (event, context) => {
    try {
        const name = event.pathParameters.name;
        const rows = await connection.query('SELECT * FROM users WHERE name = ?', [name]);
        await connection.end()

        const user = rows[0];
        return {
            'statusCode': 200,
            'body': JSON.stringify({
                firstName: user.first_name,
                lastName: user.last_name,
                bk: user.bk,
                team: user.current_team
            })
        }

    } catch (err) {
        console.log(err);
        return err;
    }
};

Я пытаюсь проверить это, высмеивая зависимость serverless-mysql, но в настоящее время я не могу это сделать. Мой тест выглядит так:

const app = require('../../app.js');
const chai = require('chai');
const sinon = require('sinon');
const expect = chai.expect;
const event = {
    pathParameters: {
        name: 'johndoe'
    }
}
var context;

var successConnectionObject = {
    connect: function() {
        return Promise.resolve();
    },
    query: function(sqlQuery, params) {
        return Promise.resolve('');
    },
    end: function() {} 
}

var mysql = require('serverless-mysql');
var stub = sinon.stub(mysql, 'connect').returns(successConnectionObject);

describe('Tests', function () {
    it('verifies successful response', async () => {
        const result = await app.lambdaHandler(event, context);

        expect(result).to.be.an('object');
        expect(result.statusCode).to.equal(200);
        mock.verify();

        mock.restore();
    });
});

Однако возвращается следующая ошибка:

TypeError: Cannot stub non-existent own property connect

Я верю, что это потому, что mysql не создан. Поэтому я заменил строку var mysql = require('serverless-mysql'); на:

var mysql = require('serverless-mysql')();

К сожалению, это приводит к следующей ошибке:

AssertionError: expected [Error: Error: self signed certificate in certificate chain] to be an object

Так что, похоже, метод connect() реального модуля serverless-mysql вызывается.

Как я могу правильно издеваться serverless-mysql с помощью sinon?

1 Ответ

1 голос
/ 28 марта 2019

require('serverless-mysql') возвращает функцию , которая возвращает различное значение каждый раз, когда она вызывается, поэтому высмеивает свойства результата one call won 't влияет на возвращаемое значение другого вызова.

Это означает, что вам нужно смоделировать саму функцию, что означает насмешку над всем модулем.

sinon не делаетне предоставляет способ макетировать весь модуль, поэтому вам придется использовать что-то другое для этой части.

Вот рабочий тест, использующий proxyquire для макета модуля serverless-mysql:

const chai = require('chai');
const sinon = require('sinon');
const expect = chai.expect;
const proxyquire = require('proxyquire');

const event = {
  pathParameters: {
    name: 'johndoe'
  }
}
var context;

var successConnectionObject = {
  connect: function () {
    return Promise.resolve();
  },
  query: function (sqlQuery, params) {
    return Promise.resolve([{
      first_name: 'first',
      last_name: 'last',
      bk: 'bk',
      current_team: 'team'
    }]);
  },
  end: function () { }
}

const stub = sinon.stub().returns(successConnectionObject);
const app = proxyquire('../../app.js', { 'serverless-mysql': stub });

describe('Tests', function () {
  it('verifies successful response', async () => {
    const result = await app.lambdaHandler(event, context);

    expect(result).to.be.an('object');  // Success!
    expect(result.statusCode).to.equal(200);  // Success!

    sinon.assert.calledWithExactly(stub, {
      config: {
        host: process.env.DB_HOST,
        user: process.env.DB_USER,
        password: process.env.DB_PASSWORD
      }
    });  // Success!
  });
});
...