amazon-web-services - 如何使用单例类解决 AWS 模拟测试

当我通过 npm 使用 AWS mock 在 Javascript 测试中执行 Jest 时,它将失败。 因为我使用单例类。

区别就在这里。

「module.exports = Users;」或「module.exports = new Users();」

我猜 AWS mock 不适用于单例类。

在那种情况下,我应该怎么做才能解决这个问题?

'use strick';

var aws = require('aws-sdk')
aws.config.update({region:'ap-northeast-1'})

class Users {

    constructor() {
        this.table = 'Users'
        this.dynamodb = new aws.DynamoDB()
    }

    getData(email) {
        let params = {
            TableName: this.table,
            Key      : { 'email': {'S':email} }
        }

        return this.dynamodb.getItem(params).promise()
    }
}
// module.exports = Users // ← this will be success.
module.exports = new Users(); // ← this will be failure.
'use strict';

var aws = require('aws-sdk-mock'),
    users = require('./user'),
    chai = require('chai'),
    path = require('path'),
    should = chai.should(),
    input = 'test@gmail.com',
    usersObj;

aws.setSDK(path.resolve('node_modules/aws-sdk'));

describe('All Tests', function () {
    // this.timeout(0);
    beforeEach(function () {
        aws.mock('DynamoDB', 'getItem', function (params, callback) {
            callback(null, {Item: {email: params.Key.email.S}});
        });

        // usersObj = new users(); ← this will be success.
        usersObj = users; // ← this will be failure.
    });

    it('getData', function (done) {
        usersObj.getData(input).then(function (res) {

            console.log(res);

            res.Item.email.should.equal(input);
            done();
        });
    });
});

最佳答案

这一行:

module.exports = new Users();

...意味着一旦代码运行就会创建一个 Users 对象...并且它会在 user.js 时立即运行需要

这一行:

users = require('./user')

...位于测试文件的顶部,这一行:

aws.mock('DynamoDB', 'getItem', function (params, callback) {
  callback(null, {Item: {email: params.Key.email.S}});
});

...在beforeEach...

...这意味着 user.js必需的 并在创建模拟之前运行...这会导致测试失败。


如果您要导出 Users 的实例,那么您只需要确保您不需要 user.js在您的测试中提交文件,直到之后您已经设置了您的模拟:

var aws = require('aws-sdk-mock'),
  chai = require('chai'),
  path = require('path'),
  input = 'test@gmail.com',
  usersObj;
chai.should()

aws.setSDK(path.resolve('node_modules/aws-sdk'));

describe('All Tests', function () {
  beforeEach(function () {
    aws.mock('DynamoDB', 'getItem', function (params, callback) {
      callback(null, { Item: { email: params.Key.email.S } });
    });  // <= set up the mock first...

    usersObj = require('./user');  // <= ...then require user.js
  });

  it('getData', function (done) {
    usersObj.getData(input).then(function (res) {
      res.Item.email.should.equal(input);  // Success!
      done();
    });
  });
});

https://stackoverflow.com/questions/56750175/

相关文章:

azure - 运行管道测试时出现无效的按需测试运行运行 ID 0 错误

python - 删除谷歌驱动器文件时权限不足错误

visual-studio-code - 寻找用于 i18n 资源包编辑的 visual studi

python - 有没有办法在 Windows 上使用 gradle 编译 python proto

hive - 如何禁用 Hive 表的事务?

scala - 寻找第二个匹配隐式

linux - devtoolset-7 STL_vector.h 未定义对 `std::__thr

c - 如何使用 DejaGnu 设置单元测试

google-kubernetes-engine - 无法将 gsutil 与 GKE 集群的工作负

python - ipywidgets 与 Jupyter Lab 版本 1.0+ 兼容吗?