编写测试以验证 jest(NodeJs) 中的对象属性

Writing a test to verify object properties in jest(NodeJs)

function.js

function sesSendEmail(message) {
  var ses = new aws.SES({ apiVersion: '2020-12-01' });
  var params = {
    Source: 'xyz@gmail.com',
    Template: 'deviceUsageStatisticsEmailTemplate',
    Destination: {
      ToAddresses: ['abc@gmail.com'],
    },
    TemplateData: message,
  };

  ses.sendTemplatedEmail(params, (err, data) => {
    if (err) console.error;
    // an error occurred
    else console.log(data); // successful response
  });
}
const exportFunctions = {
  sesSendEmail: sesSendEmail,
};
module.exports = exportFunctions;

我想编写一个测试来验证参数(源、模板等),所以我试图模拟 sendTemplatedEmail

Function.test.js

describe('sesSendEmail', () => {
  const mocksendTemplatedEmail = {
    sendTemplatedEmail: jest.fn()
  }
  index.sesSendEmail(mocksendTemplatedEmail);
  test('Check if Source is correct', () => {
    console.log(mocksendTemplatedEmail.sendTemplatedEmail.mock)
  })
})

然而,console.log是空的。请指教

单元测试解决方案如下:

index.js:

const aws = require('aws-sdk');

function sesSendEmail(message) {
  const ses = new aws.SES({ apiVersion: '2020-12-01' });
  const params = {
    Source: 'xyz@gmail.com',
    Template: 'deviceUsageStatisticsEmailTemplate',
    Destination: {
      ToAddresses: ['abc@gmail.com'],
    },
    TemplateData: message,
  };

  ses.sendTemplatedEmail(params, (err, data) => {
    if (err) {
      return console.error(err);
    }
    console.log(data);
  });
}

const exportFunctions = { sesSendEmail };

module.exports = exportFunctions;

index.test.js:

const index = require('.');
const aws = require('aws-sdk');

jest.mock('aws-sdk', () => {
  const mSes = {
    sendTemplatedEmail: jest.fn(),
  };
  return { SES: jest.fn(() => mSes) };
});

describe('59877312', () => {
  let ses;
  beforeEach(() => {
    ses = new aws.SES();
  });
  afterEach(() => {
    jest.clearAllMocks();
    jest.restoreAllMocks();
  });
  describe('sesSendEmail', () => {
    it('should send templated email success', () => {
      jest.spyOn(console, 'log');
      const mData = {};
      ses.sendTemplatedEmail.mockImplementationOnce((params, callback) => {
        callback(null, mData);
      });
      const message = 'mock message';
      index.sesSendEmail(message);
      expect(aws.SES).toBeCalledWith({ apiVersion: '2020-12-01' });
      expect(ses.sendTemplatedEmail).toBeCalledWith(
        {
          Source: 'xyz@gmail.com',
          Template: 'deviceUsageStatisticsEmailTemplate',
          Destination: {
            ToAddresses: ['abc@gmail.com'],
          },
          TemplateData: message,
        },
        expect.any(Function),
      );
      expect(console.log).toBeCalledWith(mData);
    });

    it('should handle error', () => {
      jest.spyOn(console, 'error');
      const mError = new Error('network error');
      ses.sendTemplatedEmail.mockImplementationOnce((params, callback) => {
        callback(mError, null);
      });
      const message = 'mock message';
      index.sesSendEmail(message);
      expect(aws.SES).toBeCalledWith({ apiVersion: '2020-12-01' });
      expect(ses.sendTemplatedEmail).toBeCalledWith(
        {
          Source: 'xyz@gmail.com',
          Template: 'deviceUsageStatisticsEmailTemplate',
          Destination: {
            ToAddresses: ['abc@gmail.com'],
          },
          TemplateData: message,
        },
        expect.any(Function),
      );
      expect(console.error).toBeCalledWith(mError);
    });
  });
});

100% 覆盖率的单元测试结果:

 PASS  src/Whosebug/59877312/index.test.js (11.103s)
  59877312
    sesSendEmail
      ✓ should send templated email success (16ms)
      ✓ should handle error (3ms)

  console.log node_modules/jest-mock/build/index.js:860
    {}

  console.error node_modules/jest-mock/build/index.js:860
    Error: network error
        at Object.it (/Users/ldu020/workspace/github.com/mrdulin/jest-codelab/src/Whosebug/59877312/index.test.js:46:22)
        at Object.asyncJestTest (/Users/ldu020/workspace/github.com/mrdulin/jest-codelab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:102:37)
        at resolve (/Users/ldu020/workspace/github.com/mrdulin/jest-codelab/node_modules/jest-jasmine2/build/queueRunner.js:43:12)
        at new Promise (<anonymous>)
        at mapper (/Users/ldu020/workspace/github.com/mrdulin/jest-codelab/node_modules/jest-jasmine2/build/queueRunner.js:26:19)
        at promise.then (/Users/ldu020/workspace/github.com/mrdulin/jest-codelab/node_modules/jest-jasmine2/build/queueRunner.js:73:41)
        at process._tickCallback (internal/process/next_tick.js:68:7)

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |      100 |      100 |      100 |                   |
 index.js |      100 |      100 |      100 |      100 |                   |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        12.485s

源代码:https://github.com/mrdulin/jest-codelab/tree/master/src/Whosebug/59877312