Ошибка типа: ожидалось, что заглушка даст результат, но обратный вызов не был передан. Получено [[объект объекта]] при использовании синона для моделирования вызова dynamodb get

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