1

我有以下测试:

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对象 explicity,结果相同。

我究竟做错了什么?

4

1 回答 1

1

回答了我自己的问题: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);

});

如果你什么也不传递这个方法,或者一个空对象,它就会失败。

于 2019-06-24T08:42:59.833 回答