Jest макет документаElement lang свойство - PullRequest
2 голосов
/ 26 июня 2019

Я пытаюсь манипулировать свойством documentElement lang для своих тестов.И не могу понять, как я могу это сделать.Я уже пытался определить setupFiles в конфигурации Jest - и это дало мне возможность определить его и не было возможности изменить его для различных тестов - как описано здесь: Пересмешивание `документа` в jest

Часть тестирования код выглядит так:

const lang: string = document.documentElement.lang ?
      document.documentElement.lang : Constraints.DEFAULT_LANGUAGE;

тест выглядит следующим образом:

   test('should pass `en` language when document hasn`t any specified', () => {
    const spy = jest.spyOn(window.document, 'documentElement', 'get');
    expect(spy).toHaveBeenCalled();
  });

И с setupFiles:

Object.defineProperty(document, 'documentElement', {
    writable: true,
    configurable: true,
    value: document.createElement('document')
});

Когда у меня есть файлы настройки, я получаю сообщение об ошибке: Property documentElement does not have access type get

Но когда я пытаюсь шпионить за ним без настроенного setupfile.js, шпион никогда не вызывается.

РЕДАКТИРОВАТЬ

Более четкий пример того, чего я пытаюсь достичь:

    const lang: string = document.documentElement.lang ?
      document.documentElement.lang : Constraints.DEFAULT_LANGUAGE;
    component.src = `/${lang}/mysite`;
test('should pass `de` language when document has one specified', () => {
    const spy = jest.spyOn(window.document, 'documentElement', 'get');
    const mockElement = document.createElement('document');
    mockElement.lang = 'de';
    spy.mockReturnValue(mockElement);
    expect(component.src).toContain('/de/');
  });

И в тесте я получаю:

expect(received).toContain(expected) // indexOf

    Expected substring: "/de/"
    Received string:    "http://localhost/en/mysite"

1 Ответ

1 голос
/ 26 июня 2019

Ну, вы почти у цели, но когда вы получаете доступ к свойству document.documentElement.lang, активатор get срабатывает. Таким образом, вы должны определить этот объект, как показано ниже;

Object.defineProperty(document, 'documentElement', {
    configurable: true,
    get () {
        return document.createElement('document');
    },
});

И в вашем тесте;

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

window.document.documentElement.lang;

EDIT

Забудьте о вышеупомянутом.

Просто удалите блок кода установки, по моему мнению, вам не нужен шпион или что-то в этом роде.

Создайте метод для установки языка в вашу константу. Затем протестируйте этот метод вместо проверки get действия documentElement.

Используйте код для установки свойства lang ниже перед вызовом вашего метода. (Представьте, что у вас есть языковой метод)

test('should return `de` language when document has one specified', () => {
    Object.defineProperty(document.documentElement, 'lang', { value: 'de', configurable: true });

    expect(component.language()).toBe('de');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...