2

我有一个现有的工作测试正在测试 Express 应用程序中的路由(修剪代码):

const AWS = require('aws-sdk-mock');
const AWS_SDK = require('aws-sdk');
AWS.setSDKInstance(AWS_SDK);

...

  before(() => { 
    sendEmailMock = sinon.stub().callsArgWith(1, null, 'All is well');
    AWS.mock('SES', 'sendEmail', sendEmailMock);
    server = rewire('../../../..');

...

  describe('POST:/feedback', () => { 
    it('Returns 200 with a fully formed request', (done) => {

      request(app)
        .post('/gethelp/api/v1/feedback')
        .send({
          thumbsUp: 'true',
          title: 'Abcdef ghi',
          url: 'http://google.com',
          comments: 'lkajsdj  lkajsdkjf aslkjdfa asjdflasjd lkfj',
        })
        .expect(200, () => {
          const args = sendEmailMock.args[0][0];
          ... etc

这是一个工作测试。但我需要重构它以不使用完整的服务器(因为它在启动时做了一些集成工作)。所以我要引入node-mocks-http

const httpMocks = require('node-mocks-http');
const feedbackRouteHandler = require('./feedback');

...

 before(() => {
    sendEmailMock = sinon.stub().callsArgWith(1, null, 'All is well');
    AWS.mock('SES', 'sendEmail', sendEmailMock);
  });

... 

     const mockRequest = httpMocks.createRequest({
        method: 'POST',
        url: '/gethelp/api/v1/feedback',
        body: {
          thumbsUp: 'true',
          title: 'Abcdef ghi',
          url: 'http://google.com',
          comments: 'lkajsdj  lkajsdkjf aslkjdfa asjdflasjd lkfj',
        },
      });

      const mockResponse = httpMocks.createResponse();

      feedbackRouteHandler(mockRequest, mockResponse);

      expect(mockResponse.statusCode).to.equal(200);

      expect(sendEmailMock.args).to.exist;

问题是添加node-mocks-http似乎破坏了 AWS 开发工具包的模拟。当sendEmail被击中时,它击中的是实际的 AWS 开发工具包,而不是模拟版本。它在先前版本的测试中达到了模拟版本。

我该如何node-mocks-http使用aws-sdk-mock

4

0 回答 0