заглушка sinon не распознает вызов заглушки - PullRequest
1 голос
/ 26 марта 2019

Это код для тестирования:

    const AWS = require('aws-sdk');
const { APPLICATIONS, NOTIFICATION_FREQUENCIES } = require('./config');

exports.createHandler = ({ notificationService }) => async (event, context) => {

  try{
    Object.values(APPLICATIONS).forEach(async appId => {

      const notifications =  await notificationService
        .getNotificationsByApplication(appId);



      const dailyNotifications =notifications.filter(
        e =>
          e.frequency === NOTIFICATION_FREQUENCIES.DAILY,
      );

      console.log('dailyNo', dailyNotifications);

      const dailyTemplate = notificationService.prepareDailyTemplate(
        dailyNotifications
      );
      console.log('dailyTemplate', dailyTemplate);

      notificationService.notifyToAdmin(dailyTemplate);
    });
  }
  catch(err) {
    console.log(err);
  }

};

И это мой тест с использованием sinon:

const sinon = require('sinon');
const { APPLICATIONS, NOTIFICATION_FREQUENCIES } = require('../lib/config');
describe('Daily notifier tests', () => {

  it('should prepare daily template for each of the applications', () => {

    const notificationService = require('../lib/notificationService').createHandler({
      commands: {},
      simpleMailService: {},
    });

    const notifications = [
      {
        type: 'create_order',
        frequency: NOTIFICATION_FREQUENCIES.DAILY,
      },
      {
        type: 'create_order',
        frequency: NOTIFICATION_FREQUENCIES.DAILY,
      },
      {
        type: 'create_order',
        frequency: NOTIFICATION_FREQUENCIES.MONTHLY,
      },
    ];
    const template = 'some html template as string';

    sinon.stub(notificationService, 'getNotificationsByApplication').resolves(notifications);
    sinon.stub(notificationService, 'prepareDailyTemplate').returns(template);
    sinon.stub(notificationService, 'notifyToAdmin');

    const sut = require('../lib/dailyNotifier').createHandler({
      notificationService,
    });

    const event = {};
    const context = {};


    sut(event, context);

    const dailyNotifications = [
      {
        type: 'create_order',
        frequency: NOTIFICATION_FREQUENCIES.DAILY,
      },
      {
        type: 'create_order',
        frequency: NOTIFICATION_FREQUENCIES.DAILY,
      }
    ];

    sinon.assert.calledOnce(notificationService.prepareDailyTemplate);
    sinon.assert.calledWith(notificationService.notifyToAdmin, template);


  });

});

Согласно sinon, метод prepareDailyTemplate вообще не вызывается (0 раз)), но когда я выполняю тест, я даже вижу console.log «dailyTemplate», что означает, что метод был выполнен один раз.Сообщение об ошибке:

AssertError: expected prepareDailyTemplate to be called once but was called 0 times

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

1 Ответ

1 голос
/ 26 марта 2019

sut - это async функция, созданная createHandler, поэтому она возвращает Promise.

. Вам просто нужно await Promise, которую она возвращает:

it('should prepare daily template for each of the applications', async () => {  // <= async

  // ...

  await sut(event, context);  // <= await

  // ...

  sinon.assert.calledOnce(notificationService.prepareDailyTemplate);  // Success!
});
...