Как исправить ошибку: не реализовано: навигация (кроме изменений хеша) - PullRequest
0 голосов
/ 08 января 2019

Я выполняю модульный тест для файла, содержащего window.location.href, и мне нужно проверить его.

Моя шутливая версия 22.0.4. Все хорошо, когда я запускаю свой тест на версии узла> = 10

Но я получаю эту ошибку при запуске на v8.9.3

console.error node_modules/jsdom/lib/jsdom/virtual-console.js:29
      Error: Not implemented: navigation (except hash changes)

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

[ОБНОВЛЕНИЕ] - Я внимательно изучил исходный код и думаю, что эта ошибка от jsdom.

at module.exports (webapp/node_modules/jsdom/lib/jsdom/browser/not-implemented.js:9:17)
at navigateFetch (webapp/node_modules/jsdom/lib/jsdom/living/window/navigation.js:74:3)

файл navigation.js

exports.evaluateJavaScriptURL = (window, urlRecord) => {
  const urlString = whatwgURL.serializeURL(urlRecord);
  const scriptSource = whatwgURL.percentDecode(Buffer.from(urlString)).toString();
  if (window._runScripts === "dangerously") {
    try {
      return window.eval(scriptSource);
    } catch (e) {
      reportException(window, e, urlString);
    }
  }
  return undefined;
};
exports.navigate = (window, newURL, flags) => {
  // This is NOT a spec-compliant implementation of navigation in any way. It implements a few selective steps that
  // are nice for jsdom users, regarding hash changes and JavaScript URLs. Full navigation support is being worked on
  // and will likely require some additional hooks to be implemented.

  const document = idlUtils.implForWrapper(window._document);
  const currentURL = document._URL;

  if (!flags.reloadTriggered && urlEquals(currentURL, newURL, { excludeFragments: true })) {
    if (newURL.fragment !== currentURL.fragment) {
      navigateToFragment(window, newURL, flags);
    }
    return;
  }

  // NOT IMPLEMENTED: Prompt to unload the active document of browsingContext.

  // NOT IMPLEMENTED: form submission algorithm
  // const navigationType = 'other';

  // NOT IMPLEMENTED: if resource is a response...
  if (newURL.scheme === "javascript") {
    window.setTimeout(() => {
      const result = exports.evaluateJavaScriptURL(window, newURL);
      if (typeof result === "string") {
        notImplemented("string results from 'javascript:' URLs", window);
      }
    }, 0);
    return;
  }
  navigateFetch(window);
};

не-implemented.js

module.exports = function (nameForErrorMessage, window) {
  if (!window) {
    // Do nothing for window-less documents.
    return;
  }

  const error = new Error(`Not implemented: ${nameForErrorMessage}`);
  error.type = "not implemented";

  window._virtualConsole.emit("jsdomError", error);
};

Я вижу странные логики в этом файле.

  1. const scriptSource = whatwgURL.percentDecode(Buffer.from(urlString)).toString();
  2. затем проверьте строку и верните ошибку

1 Ответ

0 голосов
/ 01 февраля 2019

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

  • Заменить window.location.href на window.location.assign(url) ИЛИ window.location.replace(url)

  • JSDOM будет все еще жаловаться на window.location.assign не реализовано.

    Error: Not implemented: navigation (except hash changes)

  • Затем в одном из ваших модульных тестов для вышеуказанного компонента / функции, содержащего window.assign(url) или window.replace(url), определите следующее

    • sinon.stub(window.location, 'assign');
    • sinon.stub(window.location, 'replace');
    • Убедитесь, что вы импортируете Sinon import sinon from 'sinon';


Надеюсь, это исправит проблему для вас, как и для меня.


Причина, по которой JSDOM жалуется на Error: Not implemented: navigation (except hash changes), заключается в том, что JSDOM не реализует такие методы, как window.alert, window.location.assign и т. Д.


Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...