it-swarm.asia

Mengejek menggunakan dukungan janji aws-sdk-mock dengan DocumentClient

Saya mencoba menulis unit test menggunakan dukungan janji aws-sdk-mock. Saya menggunakan DocumentClient.

Kode saya terlihat seperti ini:

const docClient = new AWS.DynamoDB.DocumentClient();

const getItemPromise = docClient.get(params).promise();
   return getItemPromise.then((data) => {
   console.log('Success');
   return data;
}).catch((err) => {
   console.log(err);
});

Tes tiruan dan unit saya terlihat seperti ini:

const AWS = require('aws-sdk-mock');
AWS.Promise = Promise.Promise;

AWS.mock('DynamoDB.DocumentClient', 'get', function (params, callback)
{
   callback(null, { Item: { Key: 'test value } });
});

dynamoStore.getItems('tableName', 'idName', 'id').then((actualResponse) => {
  // assertions
  done();
});

Menjalankan pengujian unit saya, tidak mengembalikan nilai pengujian saya, itu benar-benar melewati mock saya, dan panggilan panggilan dynamoDb secara langsung. Apa yang saya lakukan salah? Bagaimana saya bisa mengatur mock saya dengan benar?

7
JAck28

Tidak jelas dari kode Anda tetapi aws-sdk-mock memiliki catatan ini

NB: Layanan AWS perlu diinisialisasi di dalam fungsi yang sedang diuji agar metode SDK dapat diejek

jadi yang berikut ini tidak akan mengejek dengan benar

var AWS      = require('aws-sdk');
var sns      = AWS.SNS();
var dynamoDb = AWS.DynamoDB();

exports.handler = function(event, context) {
  // do something with the services e.g. sns.publish 
}

tapi ini akan

var AWS = require('aws-sdk');

exports.handler = function(event, context) {
  var sns      = AWS.SNS();
  var dynamoDb = AWS.DynamoDB();
  // do something with the services e.g. sns.publish 
}

lihat lebih lanjut di sini https://github.com/dwyl/aws-sdk-mock#how-usage

7
wyu

Mungkin sudah terlambat untuk menjawab, tetapi saya memiliki masalah yang sama dan saya menemukan pertanyaan ini. Setelah beberapa kali mencoba, saya menemukan solusi yang tidak melibatkan aws-sdk-mock tetapi hanya Sinon biasa, dan saya berharap membagikannya akan membantu orang lain. Perhatikan bahwa klien DynamoDB dibuat di luar lambda.

Lambda itu sendiri terlihat seperti ini:

const dynamoDB = new DynamoDB.DocumentClient();

exports.get = async event => {
    const params = {
        TableName: 'Tasks',
        Key: {
            id: event.pathParameters.id
        }
    };

    const result = await dynamoDB.get(params).promise();
    if (result.Item) {
        return success(result.Item);
    } else {
        return failure({ error: 'Task not found.' });
    }
};

Dan ujian untuk lambda ini adalah:

const sandbox = sinon.createSandbox();

describe('Task', () => {

    beforeAll(() => {
        const result = { Item: { id: '1', name: 'Go to gym'}};
        sandbox.stub(DynamoDB.DocumentClient.prototype, 'get').returns({promise: () => result});
    });

    afterAll(() => {
        sandbox.restore();
    });

    it('gets a task from the DB', async () => {
        // Act
        const response = await task.get(getStub);
        // Assert
        expect(response.statusCode).toEqual(200);
        expect(response.body).toMatchSnapshot();
    });
});

Saya suka menggunakan kotak pasir Sinon untuk dapat mematikan banyak metode DynamoDB yang berbeda dan membersihkan semuanya dalam satu restore() tunggal.

1

Agak terkait dengan pertanyaan, memperluas solusi wyu - saya juga menghadapi masalah serupa - bagi saya, di bawah ini tidak bekerja dengan aws-sdk-mock

const AWS = require('aws-sdk');
AWS.config.update({region: 'us-east-1'});
let call = function (action, params) {    
    const dynamoDb = new AWS.DynamoDB.DocumentClient();

    return dynamoDb[action](params).promise();
};

dimana ini bekerja

let call = function (action, params) {
    const AWS = require('aws-sdk');
    AWS.config.update({region: 'us-east-1'});
    const dynamoDb = new AWS.DynamoDB.DocumentClient();

    return dynamoDb[action](params).promise();
};
0
Kisanagaram