Как разрешить пробный тест AWS с помощью одноэлементных классов? - PullRequest
2 голосов
/ 25 июня 2019

когда я выполню Jest в тесте Javascript с использованием AWS-макета через npm, это будет сбой.потому что я использую синглтон-класс.

Различие, как здесь.

「module.exports = Users;」 или 「module.exports = new Users ();」

Iугадайте, что макет AWS не работает с одноэлементным классом.

в этом случае, как мне решить эту проблему?

'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();
        });
    });
});

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

Я тоже могу разрешить этот шаблон.

'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;

const awsObject = require('aws-sdk');

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}});
        });

        // it will be resolve problem by creating new AWS instance.
        users.dynamodb = new awsObject.DynamoDB();
    });

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

            console.log(res);

            res.Item.email.should.equal(input);
            done();
        });
    });
});
0 голосов
/ 27 июня 2019

Эта строка:

module.exports = new Users();

... означает, что объект Users будет создан, как только код будет запущен ... и будет запущен, как только user.js будет required.

Эта строка:

users = require('./user')

... находится вверху вашего тестового файла и эта строка:

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

... находится в beforeEach ...

... это означает, что user.js равно required и выполняется до того, как макет был создан ... что приводит к сбою теста.


Если вы собираетесь экспортировать экземпляр Users, вам просто нужно убедиться, что вы не require 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();
    });
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...