Не может издеваться над "окном" с помощью jasmine / karma и typescpript - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь смоделировать "оконный" объект в юнит-тестах жасмин / карма. Я испробовал почти все решения, и все, что мне не помогло.

  1. Самое простое:
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.

Пожалуйста, помогите!)

1 Ответ

0 голосов
/ 10 января 2020

Объект window содержит большую часть окружения, поэтому его уничтожение не будет хорошей идеей. Я думаю, что вы на самом деле пытаетесь переписать строку userAgent браузера.

Если вы запустите:

Object.getOwnPropertyDescriptor(window.navigator, 'userAgent');
// {"writable":false,"enumerable":false,"configurable":false}

Вы увидите, что свойство не настраивается или не доступно для записи. Вот почему он не может перезаписать его.

Однако вы можете попробовать:

navigator.__defineGetter__('userAgent', function () { return 'Edge'; });

Используйте его с осторожностью, так как оно устарело. Object.prototype. defineGetter ()

По состоянию на февраль 2020 года вы можете изменить зарегистрированную строку userAgent в Chrome DevTools .

...