Как смоделировать API уведомлений с JEST?

Я тестирую редукс-действия с шуткой. В частности, побочный эффект использует API уведомлений в качестве побочного эффекта. Как я могу издеваться над API уведомлений?

Теперь я просто издеваюсь так:

global.Notification = {...};

Это работает, но я думаю, что есть более элегантное решение для решения этой проблемы. Есть идеи?

У меня есть этот модуль для обработки API уведомлений:

export const requestNotifyPermission = () => {
    try {
        return Notification.requestPermission().then(function(result) {
            return result;
        });
    } catch(err) {
        console.warn('NotificationsAPI error: ' + err);
    }
};

export const getCurrentNotifyPermission = () => {
    // Possible values = default, granted, denied
    try {
      return Notification.permission;
    } catch {
      return 'denied';
    }
};

export const createNotify = (title, body)  => {
  try {
    if (getCurrentNotifyPermission() === 'granted') {
      var options = {
          body: body
      };
      return new Notification(title, options);  
    }
  } catch(err) {
    console.warn('NotificationsAPI error: ' + err);
  }
}

0 ответов

Один из способов предотвратить имитацию API уведомлений в каждом тестовом файле - это настроить Jest setupFiles.

jest.config.js

module.exports = {
  setupFiles: ["<rootDir>config.ts"],
};

config.ts

globalThis.Notification = ({
  requestPermission: jest.fn(),
  permission: "granted",
} as unknown) as jest.Mocked<typeof Notification>;

Примечание: globalThisэто самый современный способ доступа к глобальной области видимости. Если у вас нет необходимой версии Node (v12+), просто используйтеglobal объект.

Этот пример также демонстрирует использование с Typescript, что немного сложнее.

Если вы хотите имитировать различные состояния разрешений, вы можете сделать это в тестовом примере:

// Notification.permission
jest
  .spyOn(window.Notification, "permission", "get")
  .mockReturnValue("denied");


// Notification.requestPermission (which is a Promise)
jest
  .spyOn(window.Notification, "requestPermission")
  .mockResolvedValueOnce("granted");

Другие вопросы по тегам