gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:21:54 24 4
gpt4 key购买 nike

当我通过 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();
});
});
});

关于amazon-web-services - 如何使用单例类解决 AWS 模拟测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56750175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com