首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sinon模拟无服务器的mysql

使用sinon模拟无服务器的mysql
EN

Stack Overflow用户
提问于 2019-03-28 17:17:26
回答 1查看 937关注 0票数 2

我正在尝试测试使用AWS创建的AWS函数(node.js)。我的函数使用npm模块serverless-mysql连接到Aurora。以下是我的lambda功能的相关部分:

代码语言:javascript
复制
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依赖来测试这一点,但目前我无法这样做。我的测试看起来如下:

代码语言:javascript
复制
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();
    });
});

但是,这将返回以下错误:

代码语言:javascript
复制
TypeError: Cannot stub non-existent own property connect

我相信这是因为mysql没有实例化。因此,我将行var mysql = require('serverless-mysql');替换为:

代码语言:javascript
复制
var mysql = require('serverless-mysql')();

不幸的是,这会导致以下错误:

代码语言:javascript
复制
AssertionError: expected [Error: Error: self signed certificate in certificate chain] to be an object

因此,真正的connect()模块的serverless-mysql方法似乎被调用了。

如何使用sinon正确地模拟serverless-mysql

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-28 20:09:03

require('serverless-mysql')返回一个函数,该函数每次调用时都返回不同的值,因此模拟一个调用结果的属性不会影响不同调用的返回值。

这意味着您必须模拟函数本身,这意味着模拟整个模块。

sinon没有提供一种模拟整个模块的方法,因此您必须为该部分使用其他方法。

下面是一个使用proxyquire模拟serverless-mysql模块的工作测试:

代码语言:javascript
复制
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!
  });
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55403470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档