Jsdom: خطأ: لم يتم التنفيذ: التنقل

تم إنشاؤها على ١٢ يناير ٢٠١٨  ·  49تعليقات  ·  مصدر: jsdom/jsdom

بعد الترقية الأخيرة jest (التي تستخدم jsdom في الخلفية) من الإصدار 21.2.0 إلى 22.0.6 بدأت في تلقي الخطأ: "Error: Not implemented:" navigation

يعتمد الكود الخاص بي على window.location وأستخدمه في الاختبارات:

beforeEach(() => {
                window.location.href = `/ms/submission/?mybib`;
                window.location.search = '?mybib';
});

هل هناك طريقة لتحديد قيمة window.location.search باستخدام إصدار جديد من jsdom؟

التعليق الأكثر فائدة

اسمح لي بنشر إجابة سؤالي 😁
أنا ببساطة استبدل استخدامات window.location = url; و window.location.href = url; بـ

window.location.assign(url);

ثم في اختباراتي قمت بما يلي:

sinon.stub(window.location, 'assign');
expect(window.location.assign).to.have.been.calledWith(url);

يعمل مثل السحر - أتمنى أن يكون مفيدًا لشخص آخر

ال 49 كومينتر

أنا أتلقى هذا الخطأ أيضًا

Error: Not implemented: navigation (except hash changes)
    at module.exports (...\node_modules\jsdom\lib\jsdom\browser\not-implemented.js:9:17)
    at navigateFetch (...\node_modules\jsdom\lib\jsdom\living\window\navigation.js:74:3)

لا يدعم jsdom التنقل ، لذا فإن تعيين window.location.href أو ما شابه سيعطي هذه الرسالة. لست متأكدًا مما إذا كان Jest كان يقوم فقط بقمع هذه الرسائل من قبل ، أم ماذا.

ربما يكون هذا شيئًا يجب عليك إصلاحه في اختباراتك ، لأنه يعني أنه إذا كنت تجري تلك الاختبارات في المتصفح ، فسيتم تفجير عداء الاختبار تمامًا أثناء التنقل في الصفحة إلى عنوان URL جديد ، ولن ترى أي اختبارات مطلقًا النتائج. في jsdom بدلاً من ذلك ، نقوم فقط بإخراج رسالة إلى وحدة التحكم ، والتي يمكنك تجاهلها إذا أردت ، أو يمكنك إصلاح اختباراتك لجعلها تعمل بشكل أفضل في المزيد من البيئات.

على أي حال ، أود إضافة المزيد من الوثائق حول هذا الأمر للأشخاص ، لذلك سأترك هذه المشكلة مفتوحة لتتبع القيام بذلك.

احصل على ما تقوله تمامًا. انتقل تحديث Jest 22 الأخير من JSDOM 9 إلى 11 IIRC ، لذلك قد يكون السلوك مرة أخرى في 9.x مختلفًا تمامًا.

بغض النظر عن كل ذلك ، أود أن أرى التنقل مطبقًا في JSDOM بنوع من العلم لجعله غير متاح من حيث تحميل صفحة مختلفة (بروح مماثلة لـ HTML5 pushstate.) تُستخدم المكتبة بشكل شائع جدًا لأغراض الاختبار لذلك ، على الرغم من أنه قد يكون طلبًا ملتويًا ، إلا أنه سيتم استخدامه كثيرًا.

لا أعتقد أنه يجب علينا إضافة علامة تجعل اختباراتك في jsdom مختلفة عن المتصفحات. ثم يمكن أن تتعطل الأشياء الخاصة بك في المتصفحات (على سبيل المثال ، يمكن إعادة توجيه المستخدمين إلى صفحة أخرى ، بدلاً من القيام بالإجراء الذي ترى اختباراتك حدوثه) ولن تلاحظ ذلك!

حسنًا ، في هذه الحالة ، لن يقوم بأي شيء مختلف ، بخلاف عدم تفريغ سياق الصفحة الحالية. ما زلت أتوقع تحديث window.location.href ، وما إلى ذلك.

domenic أواجه نفس المشكلة وكنت أتساءل عما إذا كان هناك نوع من أفضل الممارسات لإعداد JSDOM باستخدام تطبيق يحدد window.location . من خلال ما يمكنني قوله ، ألقى JSDOM خطأ عند محاولة تعيين window.location ويسجل خطأ عند محاولة تعيين window.location.href - لكنني أقرأ على mdn أن الاثنين يجب أن يكونا مترادفين. هل يجب أن أقوم بتحديث الموقع بطريقة أخرى يسهل إيقافها؟
شاكرين للمساعدة 😅

اسمح لي بنشر إجابة سؤالي 😁
أنا ببساطة استبدل استخدامات window.location = url; و window.location.href = url; بـ

window.location.assign(url);

ثم في اختباراتي قمت بما يلي:

sinon.stub(window.location, 'assign');
expect(window.location.assign).to.have.been.calledWith(url);

يعمل مثل السحر - أتمنى أن يكون مفيدًا لشخص آخر

توافق على أن هذا يجب أن يعمل خارج الصندوق. نحن نسخر من window.location في FB ، لكن هذا يتعارض مع تطبيق jsdom History .

كفريق صغير ، نقدر بالتأكيد المساعدة من المشاريع الأكبر التي تعتمد علينا لتنفيذ التنقل بشكل صحيح في jsdom.

إذا كان أي شخص مهتمًا ، فقد يكون https://github.com/jsdom/jsdom/pull/1913 مكانًا جيدًا للبدء.

الحل المحتمل هو الاعتماد على حقن التبعية / محاكاة للكائن window في اختبارات الوحدة.

شيء مثل:

it('can test', () => {
  const mockWindow = {location: {href: null}};
  fn({window: mockWindow});
  expect(mockWindow.href).toEqual('something');
});

هذا ليس مثاليًا ولكن كما قال دومينيك @ :

من المحتمل أن يكون هذا شيئًا يجب إصلاحه في اختباراتك ، لأنه يعني أنه إذا كنت تجري تلك الاختبارات في المتصفح ، فسيتم تفجير عداء الاختبار تمامًا أثناء التنقل في الصفحة إلى عنوان URL جديد

في الوقت الحالي نحن نعيش مع هذا ونعم نقوم بتغيير كود التنفيذ الخاص بنا للاختبارات والتي تعتبر ممارسة سيئة ولكننا أيضًا ننام جيدًا في الليل!

نتمنى لك تجربة سعيدة

ساعد حل hontas :

لقد استخدمت window.location.assign(Config.BASE_URL); في الكود الخاص بي.

وهذا هو الاختبار:

jest.spyOn(window.location, 'assign').mockImplementation( l => {
   expect(l).toEqual(Config.BASE_URL);
})

window.location.assign.mockClear();

نفس المشكلة ، أنا أستخدم window.location.search = foo; في الكود الخاص بي وأود اختباره باستخدام jsdom (و jest) 🤔

ملاحظة: متعلق بـ https://github.com/facebook/jest/issues/5266

بعد التحديث إلى jsdom 12.2.0 ، حدث خطأ:
TypeError: لا يمكن إعادة تعريف الخاصية: تعيين
على const assign = sinon.stub(document.location, 'assign')
كيف تصلحها؟

@ yuri-sakharov

بعد التحديث إلى jsdom 12.2.0 ، حدث خطأ:
TypeError: لا يمكن إعادة تعريف الخاصية: تعيين
على const assign = sinon.stub(document.location, 'assign')
كيف تصلحها؟

sinon.stub(document.location, 'assign')

يجب أن يكون:

sinon.stub(window.location, 'assign')

تحتاج إلى استبدال document بـ window

لدي الوظيفة التالية

export const isLocalHost = () => Boolean(
  window.location.hostname === 'localhost' ||
  // [::1] is the IPv6 localhost address.
  window.location.hostname === '[::1]' ||
  // 127.0.0.1/8 is considered localhost for IPv4.
  window.location.hostname.match(
    /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
  )
);

بالنسبة لي لأتمكن من اختبار أنه يعمل ، أقوم بحقن hostname

it('#isLocalHost should return true for all the cases of localhost', () => {
    window.location.hostname = 'localhost';
    expect(isLocalHost()).toBeTruthy();

    window.location.hostname = '[::1]';
    expect(isLocalHost()).toBeTruthy();

    window.location.hostname = '127.0.0.1';
    expect(isLocalHost()).toBeTruthy();

    // Reset back the hostname to avoid issues with it
    window.location.hostname = '';
  });

لكني أتلقى هذا الخطأ.

لا أتوقع أن يقوم jsdom بتنفيذ التنقل بالكامل ولكن على الأقل إضافة المفاتيح والسخرية من الوظائف.

أنا في حيرة من أمري حول سبب استمرار تلقي هذا الخطأ ، أريد فقط أن أكون قادرًا على إعداد القيمة.

تضمين التغريدة
لقد استبدلت بـ window.location كما كتبت ولكن النتيجة نفسها
TypeError: Cannot redefine property: assign
أيه أفكار؟

نفس مشكلة @ yuri-sakharov تشغيل mocha.

لا يبدو أنني قادر على استبدال / تحديث / محاكاة أو القيام بأي شيء باستخدام window.location.* . الطريقة الوحيدة التي أراها حول هذا هي إنشاء نموذج window.location المخصص الخاص بي وتغيير قاعدة التعليمات البرمجية بالكامل للاعتماد على ذلك.

ساعد حل hontas :

لقد استخدمت window.location.assign(Config.BASE_URL); في الكود الخاص بي.

وهذا هو الاختبار:

jest.spyOn(window.location, 'assign').mockImplementation( l => {
   expect(l).toEqual(Config.BASE_URL);
})

window.location.assign.mockClear();

لم تنجح نسخة Jest من hontas بالنسبة لي ، لكن هذا لم ينجح:

window.location.assign = jest.fn();
expect(window.location.assign).toHaveBeenCalledWith('https://correct-uri.com');
window.location.assign.mockRestore();

إذا كنت لا ترغب في تغيير الكود الخاص بك لاستخدام location.assign - يبدو أن هذا يعمل مع JSDom 11 و 13 (على الرغم من أن هناك احتمال أن JSDom قد يكسرها في المستقبل ...)

delete window.location;
window.location = {}; // or stub/spy etc.

نجحت الإجابة الأخيرة بالنسبة لي ، لكن كان علي تحديد replace :

delete window.location
window.location = { replace: jest.fn() }

آمل أن يساعد.

تظهر لي TypeError: لا يمكن إعادة تعريف الخاصية: تعيين مع sinon 7.2.3 و jsdom 13.2.0. ليس لديك فكرة لماذا هذا يعمل لبعض الناس وليس للآخرين؟

هذا ما نجح معي:

    global.window = Object.create(window);
    const url = 'http://localhost';
    Object.defineProperty(window, 'location', {
      value: {
        href: url,
      },
      writable: true,
    });

استخدمنا pushState لجعل هذا يعمل

 window.history.pushState(
        {},
        '',
        'http://localhost/something/123?order=asc'
      );

هذا هو الوضع الصعب. لا يدعم JSDOM التنقل بشكل كامل (بخلاف مسارات التنقل) ولا يتيح لنا JSDOM إمكانية التنقل. والنتيجة النهائية هي أنه لا يمكنني كتابة الاختبارات التي تحاول في النهاية تشغيل التنقل .

إذا تعلمت JSDOM التنقل (لست متأكدًا حتى من معنى ذلك) ، فربما يمكنني التأكيد على وجودي في الصفحة المناسبة. بالنسبة لحالات استخدام الاختبار الخاصة بي ، على الرغم من ذلك ، فإن التأكيد على أن التنقل قد تم تشغيله ، بدلاً من تنفيذه فعليًا ، يعد أكثر نظافة / أسرع. هذا ما فعلته تاريخيًا عند الاختبار باستخدام jsdom والآن تم كسره.

اسمح لي بنشر إجابة سؤالي الخاص
أنا ببساطة استبدل استخدامات window.location = url; و window.location.href = url; بـ

window.location.assign(url);

ثم في اختباراتي قمت بما يلي:

sinon.stub(window.location, 'assign');
expect(window.location.assign).to.have.been.calledWith(url);

يعمل مثل السحر - أتمنى أن يكون مفيدًا لشخص آخر

هذا إذا كنت تتحكم في عنوان url المستهدف ، ولكن ماذا لو كنت تقوم بتحميل موقع google أو Instagram. او اي موقع؟ كيف تحل هذه المشكلة؟

بناءً على إجابة من chrisbateman ، تمكنت من الحصول على هذا العمل في بيئة Jest. بالنسبة لأي شخص يستخدم Jest ، إليك الحل البديل:

describe('', () => {
    const originalLocation = window.location;

    beforeEach(() => {
        delete window.location;

        window.location = {
            href: '',
        };
    });

    afterEach(() => {
        window.location = originalLocation;
    });

    it('', () => {
        // test here
    });
});

لقد قمت بحل هذه المشكلة باستخدام هذا التكوين. أردت اختبار إعادة التوجيه لعناوين URL للتجزئة:

    beforeEach(() => {
      delete global.window;
      global.window = {
        location: { replace: jest.fn(url => ({ href: url })) },
      };
    });
    it('should redirect hash url', () => {
      window.location.hash = '#/contrat?id=8171675304';
      global.window.location.href =
        'http://localhost:3000/#/contrat?id=8171675304';
      redirectHashUrl();

      expect(window.location.replace).toHaveBeenCalled();
    });

chrisbateman بفضلhamzahamidi، أن الحلول تعمل بشكل جيد.

ربما لا تكون ممارسة جيدة ، ولكن لدينا بعض الاختبارات ، تلك تعتمد على الموقع / المضيف / اسم المضيف وخصائص الموقع الأخرى. لذا فإن الاستهزاء بالموقع كما نريد ثم الاستعادة بعد ذلك بالنسبة لي.

const realLocation = window.location;

describe('bla bla', () => {
  afterEach(() => {
    window.location = realLocation;
  });

  it('test where I want to use hostname', () => {
    delete window.location;
    window.location = { 
      hostname: 'my-url-i-expect.com'
    };
    // check my function that uses hostname
  });
});

هذا ما نجح معي:

    global.window = Object.create(window);
    const url = 'http://localhost';
    Object.defineProperty(window, 'location', {
      value: {
        href: url,
      },
      writable: true,
    });

لا يعمل في دائرة مثل CI

ساعد حل hontas :

لقد استخدمت window.location.assign(Config.BASE_URL); في الكود الخاص بي.

وهذا هو الاختبار:

jest.spyOn(window.location, 'assign').mockImplementation( l => {
   expect(l).toEqual(Config.BASE_URL);
})

window.location.assign.mockClear();

شكرا يا صديقي ، لقد أنقذتني يومًا! :)

في حالتي ، أقوم باختبار سلسلة الاستعلام ، وبما أن موضوع المواصفات الخاصة بي هو سلسلة الاستعلام نفسها ، لا أريد تجاوزها ، لكنني سعيد بإيقافها. في حالتي ، نجح هذا بشكل جيد:

    let name = "utm_content"
    window.history.pushState({}, 'Test Title', '/test.html?utm_content=abc');
    expect(ParseUrlUtils.getParam(name)).toBe("abc")

لاحظ أنه هنا لا يهم ما هو عنوان النافذة ولا يهم أيضًا أنه /test.html (وهو ليس حقيقيًا) ، كل ما يهم هو أن سلسلة الاستعلام تم جلبها بشكل صحيح ( هذا يمر)

المشكلة مع الأمثلة هي أن الأساليب والأرقام لا تستخدم. ما أفعله هو في الأساس استبدال كائن الموقع بكائن عنوان URL. يحتوي عنوان URL على جميع خصائص الموقع (بحث ، مضيف ، تجزئة ، إلخ).

const realLocation = window.location;

describe('My test', () => {

    afterEach(() => {
        window.location = realLocation;
    });

    test('My test func', () => {

        // @ts-ignore
        delete window.location;

        // @ts-ignore
        window.location = new URL('http://google.com');

        // ...
    });
});

أنا أتلقى هذا الخطأ أيضًا

Error: Not implemented: navigation (except hash changes)
    at module.exports (...\node_modules\jsdom\lib\jsdom\browser\not-implemented.js:9:17)
    at navigateFetch (...\node_modules\jsdom\lib\jsdom\living\window\navigation.js:74:3)

ساعد حل hontas :

لقد استخدمت window.location.assign(Config.BASE_URL); في الكود الخاص بي.

وهذا هو الاختبار:

jest.spyOn(window.location, 'assign').mockImplementation( l => {
   expect(l).toEqual(Config.BASE_URL);
})

window.location.assign.mockClear();

هذا عمل لي ، شكرا! ومع ذلك ، كان علي استخدام الوسيطة done من اختبار الدعابة () ، وإلا فلن أكون متأكدًا من أنه تم تقييم التوقعات وربما انتهى الاختبار بنجاح على أي حال:

it('should', (done) => {
jest.spyOn(window.location, 'assign').mockImplementation( l => {
   expect(l).toEqual(Config.BASE_URL);
   done();
})

window.location.assign.mockClear();
}

hontas لا يعمل معي :( غير قادر على إعادة كتابة خاصية

هل توجد أي طريقة لمعرفة الاختبار الذي يؤدي إلى تشغيل رسالة "لم يتم التنفيذ: التنقل"؟ لدي مجموعة من 43 اختبارًا - يتم عرض الخطأ مرة واحدة فقط ويستمر في الارتداد. لا أستطيع معرفة أي اختبار يجب إصلاحه !!! لا يعطيني تتبع المكدس أي إشارة إلى الجاني:

console.error
  Error: Not implemented: navigation (except hash changes)
      at module.exports (/Users/naresh/projects/mobx-state-router/node_modules/jsdom/lib/jsdom/browser/not-implemented.js:9:17)
      at navigateFetch (/Users/naresh/projects/mobx-state-router/node_modules/jsdom/lib/jsdom/living/window/navigation.js:76:3)
      at exports.navigate (/Users/naresh/projects/mobx-state-router/node_modules/jsdom/lib/jsdom/living/window/navigation.js:54:3)
      at Timeout._onTimeout (/Users/naresh/projects/mobx-state-router/node_modules/jsdom/lib/jsdom/living/nodes/HTMLHyperlinkElementUtils-impl.js:81:7)
      at listOnTimeout (internal/timers.js:531:17)
      at processTimers (internal/timers.js:475:7) undefined

    at VirtualConsole.<anonymous> (node_modules/jsdom/lib/jsdom/virtual-console.js:29:45)
    at module.exports (node_modules/jsdom/lib/jsdom/browser/not-implemented.js:12:26)
    at navigateFetch (node_modules/jsdom/lib/jsdom/living/window/navigation.js:76:3)
    at exports.navigate (node_modules/jsdom/lib/jsdom/living/window/navigation.js:54:3)
    at Timeout._onTimeout (node_modules/jsdom/lib/jsdom/living/nodes/HTMLHyperlinkElementUtils-impl.js:81:7)

hontas لا يعمل معي :( غير قادر على إعادة كتابة خاصية

كما أفهم ، غيّرت Jest شيئًا ما في الإصدار الجديد ("jest": "^ 26.0.1") لذلك يعمل هذا الآن:

// Mock
  Object.defineProperty(window, 'location', {
    value: {
      pathname: '/terminals',
      assign: jest.fn(),
    },
  });

// Then test
expect(window.location.assign).toBeCalledWith('/auth');

هل توجد أي طريقة لمعرفة الاختبار الذي يؤدي إلى تشغيل رسالة "لم يتم التنفيذ: التنقل"؟ لدي مجموعة من 43 اختبارًا - يتم عرض الخطأ مرة واحدة فقط ويستمر في الارتداد. لا أستطيع معرفة أي اختبار يجب إصلاحه !!! لا يعطيني تتبع المكدس أي إشارة إلى الجاني:

console.error
  Error: Not implemented: navigation (except hash changes)
      at module.exports (/Users/naresh/projects/mobx-state-router/node_modules/jsdom/lib/jsdom/browser/not-implemented.js:9:17)
      at navigateFetch (/Users/naresh/projects/mobx-state-router/node_modules/jsdom/lib/jsdom/living/window/navigation.js:76:3)
      at exports.navigate (/Users/naresh/projects/mobx-state-router/node_modules/jsdom/lib/jsdom/living/window/navigation.js:54:3)
      at Timeout._onTimeout (/Users/naresh/projects/mobx-state-router/node_modules/jsdom/lib/jsdom/living/nodes/HTMLHyperlinkElementUtils-impl.js:81:7)
      at listOnTimeout (internal/timers.js:531:17)
      at processTimers (internal/timers.js:475:7) undefined

    at VirtualConsole.<anonymous> (node_modules/jsdom/lib/jsdom/virtual-console.js:29:45)
    at module.exports (node_modules/jsdom/lib/jsdom/browser/not-implemented.js:12:26)
    at navigateFetch (node_modules/jsdom/lib/jsdom/living/window/navigation.js:76:3)
    at exports.navigate (node_modules/jsdom/lib/jsdom/living/window/navigation.js:54:3)
    at Timeout._onTimeout (node_modules/jsdom/lib/jsdom/living/nodes/HTMLHyperlinkElementUtils-impl.js:81:7)

من الصعب معرفة أي اختبار لم يتم تنفيذه يأتي الخطأ.

أقوم بإضافة نقطة توقف عند node_modules/jsdom/lib/jsdom/browser/not-implemented.js:12 ، وقم بتشغيل جلسة تصحيح الأخطاء وانتظر حتى يتم الوصول إلى نقطة التوقف. عندها فقط أرى الاختبار الذي يجب أن أحسنه للتخلص من هذه الرسالة.
image

أحيانًا يستغرق الأمر من 2-3 دقائق حتى يصل العداء إلى الاختبار مع وجود مشكلة.

ملاحظة: في مشروعي الحالي ، يوجد 176 اختبارًا متعلقًا بـ jsdom

أنا أستخدم حاليًا Jest 26.0.1 وما يلي يعمل بالنسبة لي:

  1. استخدم window.location.assign(url) لتغيير موقع النافذة.

  2. اسخر من كائن الموقع على النحو التالي (لاحظ أن عدم حذف وإعادة بناء الكائن أولاً لا يزال ينتج عنه خطأ لم يتم تنفيذه في الإصدار الملحوظ من Jest وما قبله على ما أعتقد ، أيضًا Object.defineProperty لا يعمل ولا يزال يؤدي إلى خطأ):

delete window.location;
window.location = {
    href: '',
    hostname: '',
    pathname: '',
    protocol: '',
    assign: jest.fn()
};
  1. التأكيد باستخدام:
expect(window.location.assign).toBeCalledWith(url);

سيكون من الرائع حقًا أن تسمح لنا المزاح بالسخرية من الموقع بسهولة دون كل هذه المشكلات والتغييرات المستمرة. كنت أستخدم سابقًا window.location.assign = jest.fn() دون أي مشاكل لفترة طويلة ، ثم قمت بالترقية من الإصدار 24 والآن هذا.

هل هناك سبب وجيه لقفل / تجميد واجهات برمجة تطبيقات Window؟
يبدو أن هذا هو العائق الذي يواجه الأشخاص الذين يحاولون الالتفاف حول التنقل الذي لا يتم تنفيذه.

إذا لم يكن الأمر كذلك ، فهل يمكننا فقط عدم تجميدها؟ لا أعتقد أنه حتى المتصفحات صارمة في منعك من تغيير كائنات النافذة.

إذا كان لديك مثال على سلوك jsdom بشكل مختلف عن المتصفحات ، فالرجاء إرسال مشكلة باتباع نموذج المشكلة (بما في ذلك سلوك المستعرض jsbin أو ما شابه ذلك).

هل يواجه أي شخص آخر نفس Error: Not implemented: navigation (except hash changes) أثناء اختبارات Jest التي تطلق حدث نقرة على عنصر إرساء href ؟ بالنسبة لاختباراتي ، فأنا أتجسس على وظيفة تسمى onClick وأقوم بتأكيدات حول ذلك ، لذلك أحتاج بالفعل إلى إطلاق حدث النقر على عنصر الارتساء.

الحلول المذكورة أعلاه تتعلق بالسخرية من عمل window.location بالنسبة لي حيث أتصل صراحةً بـ window.location.replace أو window.location.assign ، لكن لا تساعد في هذه الحالة حيث ينشأ التنقل من عنصر الارتساء يتم النقر عليها.

أي أفكار حول الحلول؟ شكرا!

كيف يمكنك اختبار هذا الرمز في المتصفح؟ ضع في اعتبارك أن النقر فوق الارتباط في المتصفح سيؤدي إلى إبعاد صفحتك بالكامل والتخلص من أي نتائج اختبار. لذا فإن كل ما ستفعله لمنع ذلك ، سيمنع أيضًا إخراج رسائل التحذير الأقل دراماتيكية من jsdom إلى وحدة التحكم.

في حالتي ، تمت ترقية مشروع Jest من 23 إلى 26 إصدارًا.
واجهت مشكلة مع location.search . حدث نفس الخطأ Error: Not implemented: navigation .
الوحدة التي اختبرتها تحصل على قيم معلمات استعلام البحث.
نجح التنفيذ التالي بالنسبة لي:

beforeAll(() => {
  delete window.location;
  window.location = new URL('your URL');
})

afterAll(() => {
  window.location.search = '';
})

mattcphillips هل اكتشفت كيفية إصلاح هذا؟ أواجه مشكلة أيضًا عند النقر فوق

Sabrinovsky لا ، انتهى بي الأمر فقط بإضافة برنامج نصي إلى setupFiles في تكوين jest الخاص بي الذي من شأنه أن يبتلع أخطاء وحدة التحكم القادمة من التنقل عبر jsdom بحيث لا تشوش اختباراتنا. أكثر من أي شيء آخر ، ولكن يبدو أن هذه الأخطاء متوقعة في إعداد الاختبار الخاص بنا.

هذا هو النص الذي قمت بتشغيله قبل اختباراتي:

// There should be a single listener which simply prints to the
// console. We will wrap that listener in our own listener.
const listeners = window._virtualConsole.listeners('jsdomError');
const originalListener = listeners && listeners[0];

window._virtualConsole.removeAllListeners('jsdomError');

// Add a new listener to swallow JSDOM errors that orginate from clicks on anchor tags.
window._virtualConsole.addListener('jsdomError', error => {
  if (
    error.type !== 'not implemented' &&
    error.message !== 'Not implemented: navigation (except hash changes)' &&
    originalListener
  ) {
    originalListener(error);
  }

  // swallow error
});

هذا عمل معي.

delete global.window.location
global.window.location = { href: 'https://test.com' }

هذا عمل معي

delete window.location
window.location = { assign: jest.fn() }

إذا حصلت على TypeError: Cannot assign to read only property 'assign' of object '[object Location]' ، فعندئذٍ باستخدام شيء مثل هذا في jest.setup.ts :

""
global.window = Object.create (نافذة) ،
Object.defineProperty (نافذة ، "موقع" ، {
القيمة: {
... window.location،
} ،
قابل للكتابة: صحيح ،
}) ؛
""

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

mitar picture mitar  ·  4تعليقات

machineghost picture machineghost  ·  4تعليقات

khalyomede picture khalyomede  ·  3تعليقات

philipwalton picture philipwalton  ·  4تعليقات

josephrexme picture josephrexme  ·  4تعليقات