Устранение неполадок, связанных с макетами AWS в NodeJS - PullRequest
0 голосов
/ 20 июня 2019

У меня есть следующий тест:

const AWSMock = require('aws-sdk-mock');
const AWS = require('aws-sdk');
const sinon = require('sinon');

function sendMetric() {
    const cloudwatch = AWS.CloudWatch();
    cloudwatch.putMetricData();
}

describe('Meh', () => {

    it('meh', () => {
        let sendMetricSpy = sinon.spy();
        AWSMock.mock('CloudWatch', 'putMetricData', sendMetricSpy);
        sendMetric();
        expect(sendMetricSpy.calledOnce).toEqual(true);
    });
});

Я ожидаю, что тест пройден, потому что я сделал то, что документация говорит. Это искаженный пример того, чего я пытаюсь достичь в моем реальном коде.

Фактический результат выполнения теста:

 FAIL  functions/monitor/__test__/j.test.js
  Meh
    ✕ meh (10ms)

  ● Meh › meh

    expect(received).toEqual(expected) // deep equality

    Expected: true
    Received: false

      14 |         AWSMock.mock('CloudWatch', 'putMetricData', sendMetricSpy);
      15 |         sendMetric();
    > 16 |         expect(sendMetricSpy.calledOnce).toEqual(true);
         |                                          ^
      17 |     });
      18 | });
      19 | 

Я не знаю, как устранить эту проблему дальше.

Я также пытался установить aws-sdk объектную экспансию , что привело к тому же результату.

Что я делаю не так?

1 Ответ

0 голосов
/ 24 июня 2019

Ответил на мой собственный вопрос: вызову putMetricData необходимо передать объект с правильными свойствами.Рабочий пример:

const REALAWS = require('aws-sdk');
const sinon = require('sinon');
const AWS = require('aws-sdk-mock');

const metricParams = {
    MetricData: [
        {
            MetricName: 'ServiceIsHealthy',
            Dimensions: [
                {
                    Name: 'Stage',
                    Value: 'foo',
                },
            ],
            StorageResolution: '60',
            Timestamp: new Date(),
            Unit: 'None',
            Value: '1',
        },
    ],
    Namespace: 'namespace',
};

test('Should return API Keys',  () => {

    const putMetricData = () => {
        const cloudwatch = new REALAWS.CloudWatch();
        return cloudwatch.putMetricData(metricParams)
            .promise();
    };

    const sinon = require('sinon');
    const putMetricDataSpy = sinon.spy();

    AWS.mock('CloudWatch', 'putMetricData', putMetricDataSpy);

    const apiNames = putMetricData();
    sinon.assert.calledOnce(putMetricDataSpy);

});

If you pass the method nothing, or an empty object, it fails.
...