【问题标题】:Troubleshooting AWS mocks in NodeJS对 NodeJS 中的 AWS 模拟进行故障排除
【发布时间】:2019-11-03 07:38:20
【问题描述】:

我有以下测试:

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

我希望测试通过,因为我已经按照the documentation 所说的做了。这是我试图在我的实际代码中实现的一个精炼示例。

运行测试的实际输出是:

 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 | 

我不知道如何进一步解决此问题。

我也试过setting the aws-sdk object explicity,结果一样。

我做错了什么?

【问题讨论】:

    标签: node.js jestjs aws-sdk sinon aws-sdk-mock


    【解决方案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);
    
    });
    
    

    如果你什么都不传递,或者是一个空对象,它就会失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-14
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 2011-02-07
      • 2013-11-20
      • 1970-01-01
      相关资源
      最近更新 更多