#node.js #amazon-web-services #sinon #stub #sinon-chai
Вопрос:
У меня есть простая лямбда-функция, которая вызывает get в dynamodb. Я пытаюсь высмеять это с помощью синона и застрял с ошибкой.
app.js
var AWS = require('aws-sdk'); AWS.config.update({region: 'us-east-1'}); async function run(){ const dynamoDB = new AWS.DynamoDB.DocumentClient(); const params = { TableName: 'employees', Key: { name: "naxi" } }; const result = await dynamoDB.get(params).promise(); if (result.Item) { return result.Item; } else { return { error: 'Task not found.' }; } } module.exports = { run }
index.spec.js
const sinon = require('sinon'); const assert = require('assert'); const proxyquire = require('proxyquire'); describe('Test Suite', () =gt; { let mut; let clientStub; before(() =gt; { clientStub = { get: sinon.stub() } const awsStub = { DynamoDB: { DocumentClient: class { constructor() { return clientStub; } } } } mut = proxyquire('../app.js', { 'aws-sdk': awsStub }) }); it('should get random data!', async () =gt; { const expectedData = "neeraj"; clientStub.get.yields(null, expectedData); const data = await mut.run(); sinon.assert.callCount(clientStub.get, 1); assert.strictEqual(data, expectedData); }); })
Пакет.json
"scripts": { "test": "mocha ../**/*spec.js --recursive --timeout 10000" }
Как только я запускаю тестовый сценарий, я получаю следующую ошибку.
TypeError: stub expected to yield, but no callback was passed. Received [[object Object]]
Кто-нибудь может, пожалуйста, сказать мне, что я здесь упускаю ?
Ответ №1:
вот как я тестирую свой код с помощью пакета supertest и jest.
В моем бэкэнде я делаю почтовый запрос на отправку некоторых данных. Конечно, вы можете пропустить в соответствии с вашими потребностями
let sandbox; describe('Test', () =gt; { beforeEach(() =gt; { sandbox = sinon.createSandbox(); // process.env.redirectBaseUrl = 'http://xxxx/'; // if you want to set }); afterEach(() =gt; { delete process.env.redirectBaseUrl; sandbox.restore(); }); test('should return converted url', async () =gt; { const data = { Item: { convertedUrl: 'abc', }, }; sandbox .stub(AWS.DynamoDB.DocumentClient.prototype, 'get') .returns({ promise: () =gt; data }); const app = require('../app'); const response = await request(app) .post('/users/anon-user/urls') .send({ originalUrl: 'https://google.com' }); expect(response.body).toMatchObject({ convertedUrl: 'abc' }); expect(response.statusCode).toBe(201); }); })
Комментарии:
1. Теперь, после некоторых настроек, я заставил его работать. Спасибо, Джатин!
2. Если это помогло вам, можете ли вы принять его в качестве ответа, чтобы он мог помочь другим в будущем, конечно, не стесняйтесь редактировать мой ответ и добавлять свои настройки
Ответ №2:
Ниже показано, как я заставил это работать.
const sinon = require('sinon'); const assert = require('assert'); const proxyquire = require('proxyquire'); var AWS = require('aws-sdk'); let sandbox; describe('Test', () =gt; { beforeEach(() =gt; { sandbox = sinon.createSandbox(); }); afterEach(() =gt; { sandbox.restore(); }); it('should return something', async () =gt; { const data = { Item: { convertedUrl: 'abc', } }; sandbox .stub(AWS.DynamoDB.DocumentClient.prototype, 'get') .returns({ promise: () =gt; data }); const app = require('../app'); const result = await app.run(); assert.strictEqual(result, data); }); });