Как смоделировать 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");