当我通过 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/