Я пытаюсь смоделировать "оконный" объект в юнит-тестах жасмин / карма. Я испробовал почти все решения, и все, что мне не помогло.
- Самое простое:
const mockWindow: any = () => {
return {
navigator: {
userAgent: "Edge"
}
};
};
//in some test
window = mockWindow();
Ошибка: Ошибка типа: Попытка присвоения свойство только для чтения. (строка 25) "Жасмин"
Еще один:
class MockWindow {
public navigator = { userAgent: "Edge" };
}
//in some test
window = new MockWindow() as any;
Ошибка: Ошибка типа: Попытка присвоить свойству только для чтения. (строка 25) "Жасмин"
Использование defineProperty:
Object.defineProperty(navigator, "userAgent", {
value: () => "Edge",
configurable: true,
writable: true
});
Как вы можете видеть, я также пробовал это решение с атрибутами, такими как "настраиваемый" и "доступный для записи".
Ошибка: TypeError: Попытка настроить настраиваемый атрибут не настраиваемого свойства. (строка 25) "Жасмин"
Использование jasmine mock:
spyOn<any>(window, "navigator").and.returnValue({ userAgent: "Edge" });
Работает без ошибок, но окно не проверяется. 5. Хитрый:
window.navigator['__defineGetter__']('userAgent', function(){
return 'Edge';
});
Ошибка: TS7053: Элемент неявно имеет тип 'any', потому что выражение типа '" defineGetter "'> не может быть использовано для индексации типа «Навигатор».
Свойство « defineGetter » не существует для типа «Навигатор».
Я уверен, что какое-то решение должно существовать. Я помню, как делал это в другом проекте, и все работало хорошо. Возможно, мне нужно добавить некоторые свойства конфигурации в конфиги karma / jasmine / typescript.
Пожалуйста, помогите!)