Definitelytyped: يعد<string>لا يقبل .toEqual معلمة السلسلة. يتطلب أيضًا الوعد.</string>

تم إنشاؤها على ١٦ مارس ٢٠١٧  ·  13تعليقات  ·  مصدر: DefinitelyTyped/DefinitelyTyped

  • [x] حاولت استخدام الحزمة @types/2.5.46 وواجهت مشاكل.
  • [] حاولت استخدام أحدث إصدار مستقر من tsc. https://www.npmjs.com/package/typescript
  • [] لدي سؤال غير مناسب لـ StackOverflow . (يرجى طرح أي أسئلة مناسبة هناك).
  • [] [أذكر] (https://github.com/blog/821-mention-somebody-they-re-notified) المؤلفون (انظر Definitions by: في index.d.ts ) حتى يتمكنوا من الرد .

في 2.5.45 تمكنت من القيام بشيء من هذا القبيل:
expect(element(by.id('id')).getAttribute('attr')).toEqual('myValue');
الآن يعطيني خطأ
TS2345:Argument of type '"myValue"' is not assignable to parameter of type 'Expected<Promise<string>>'.

يتوقف عن الشكوى إذا أضفت .toString بعد getAttribute ولكني لست متأكدًا من أنه سيعمل.

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

حتى يتم إصلاح ذلك ، هناك العديد من الحلول:

  1. إصلاح إصدار الكتابة إلى 2.5.45
    سيستخدم هذا ببساطة أحدث إصدار عمل.
    يبدو أن إصلاح إصدار الكتابة أصبح من أفضل الممارسات على أي حال لأن الكتابة لا يمكن أن تتبع SemVer ويمكن أن تؤدي التغييرات في الإصدار الثانوي إلى كسر التصميم بسهولة.
    راجع هذه المشكلات:
    https://github.com/DefinitelyTyped/DefinitelyTyped/issues/14579
    https://github.com/DefinitelyTyped/DefinitelyTyped/issues/14569
    https://github.com/DefinitelyTyped/DefinitelyTyped/issues/14338
    https://github.com/DefinitelyTyped/DefinitelyTyped/pull/13994#issuecomment -275949045

  2. استخدم any كمعامل عام لـ expect
    لا تزال الكتابة الجديدة تسمح لك بالحصول على السلوك القديم ، ما عليك سوى أن تحدد بوضوح أنك تريد استخدام any كنوع مثل هذا

expect<any>(element(by.id('id')).getAttribute('attr')).toEqual('myValue');
  1. اكتب كتابات للوظائف غير المتزامنة expect وأضفها إلى مشروعك
    سيكون هذا هو الحل الأفضل ولكن يجب أن يتم بواسطة المنقلة
    من المحتمل أن يبدو شيء مثل
    // UNTESTED CODE!
    interface AsyncMatchers<T> extends Matchers<Promise<T>> {
        toBe(expected: Expected<T>, expectationFailOutput?: any): boolean;
        toEqual(expected: Expected<T>, expectationFailOutput?: any): boolean;
        toContain(expected: T, expectationFailOutput?: any): boolean;
        not: AsyncMatchers<T>;
    }

أضف هذا الرمز في protractor.d.ts في مشروعك في مكان ما يمكن أن يراه مترجم TypeScript ويجب أن يحل مشاكلك ، بالنظر إلى الوعد في expect الذي يحل بالفعل إلى النوع المقدم في toEqual

ال 13 كومينتر

نعم ، هذه مشكلة كبيرة لأي شخص يستخدم المنقلة في TypeScript.

يبدو أن Jasmine (أو ربما نسخة منقلة من Jasmine إذا كانت تعدلها - لست متأكدًا؟) تدعم توقع الوعد ثم اختبار القيمة المحسومة للوعد ، دون أن يضطر مؤلف الاختبار إلى حل الوعد بنفسه.

يبدو أن @ lukas-zech-software جعل المباريات عامة ، وهو أمر رائع حقًا ، لكنه يكسر الوعود ويتطابق مع القيم التي تم تحديدها.

كما ذكرنا سابقًا في تعليقات العلاقات العامة ، هذا ليس شيئًا يمكن أن تفعله كتابات الياسمين.

تعمل المنقلة على توسيع الوظائف بحيث يتعين عليها توفير الكتابة لهذا الغرض.
إذا كان هناك أي كتابة لمنقلة على DefinitelyTyped ، لكان هذا قد حدث أثناء الاختبارات ولكن لا يوجد لذلك لا يمكنني إصلاح هذا هنا.
في الواقع لا تقدم منقلة أي كتابات على الإطلاق لهذا الغرض ، لذا فهي تعتمد ببساطة على expect قبول any كمعامل

بالكاد يمكنني إضافة كتابات لـ expect غير المتزامن والذي لن يعمل في الياسمين نفسه.
يرجى فتح مشكلة بالمنقلة واطلب منهم تمديد كتابة الياسمين بشكل صحيح.

حتى يتم إصلاح ذلك ، هناك العديد من الحلول:

  1. إصلاح إصدار الكتابة إلى 2.5.45
    سيستخدم هذا ببساطة أحدث إصدار عمل.
    يبدو أن إصلاح إصدار الكتابة أصبح من أفضل الممارسات على أي حال لأن الكتابة لا يمكن أن تتبع SemVer ويمكن أن تؤدي التغييرات في الإصدار الثانوي إلى كسر التصميم بسهولة.
    راجع هذه المشكلات:
    https://github.com/DefinitelyTyped/DefinitelyTyped/issues/14579
    https://github.com/DefinitelyTyped/DefinitelyTyped/issues/14569
    https://github.com/DefinitelyTyped/DefinitelyTyped/issues/14338
    https://github.com/DefinitelyTyped/DefinitelyTyped/pull/13994#issuecomment -275949045

  2. استخدم any كمعامل عام لـ expect
    لا تزال الكتابة الجديدة تسمح لك بالحصول على السلوك القديم ، ما عليك سوى أن تحدد بوضوح أنك تريد استخدام any كنوع مثل هذا

expect<any>(element(by.id('id')).getAttribute('attr')).toEqual('myValue');
  1. اكتب كتابات للوظائف غير المتزامنة expect وأضفها إلى مشروعك
    سيكون هذا هو الحل الأفضل ولكن يجب أن يتم بواسطة المنقلة
    من المحتمل أن يبدو شيء مثل
    // UNTESTED CODE!
    interface AsyncMatchers<T> extends Matchers<Promise<T>> {
        toBe(expected: Expected<T>, expectationFailOutput?: any): boolean;
        toEqual(expected: Expected<T>, expectationFailOutput?: any): boolean;
        toContain(expected: T, expectationFailOutput?: any): boolean;
        not: AsyncMatchers<T>;
    }

أضف هذا الرمز في protractor.d.ts في مشروعك في مكان ما يمكن أن يراه مترجم TypeScript ويجب أن يحل مشاكلك ، بالنظر إلى الوعد في expect الذي يحل بالفعل إلى النوع المقدم في toEqual

رائع ، شكرًا لتوضيح هذا @ lukas-zech-software. نقدر الحلول المختلفة. انتهى بي الأمر بإغلاق الكتابة على إصدار سابق في الوقت الحالي.

اقترح هذا يمكن إغلاقه.

استخدام غير متزامن / انتظار "dereference" يعمل الوعد.

على سبيل المثال بدلاً من

it('should have header', () => {
    let subject = element(by.css('h1')).isPresent();
    let result  = true;
    expect(subject).toEqual(result);
  });

احصل عليه كما

it('should have header', async () => {
    let subject = await element(by.css('h1')).isPresent();
    let result  = true;
    expect(subject).toEqual(result);
  });

توقع(
إلى
توقع(

عملت بالنسبة لي

تثبيت @types/jasminewd العمل بالنسبة لي ، من الرابط

beforeEach (() => {
الصفحة = xxx جديد () ؛
browser.waitForAngularEnabled (خطأ) ،
}) ؛

هذا يحل المشكلة

بالنسبة لي ، نجح تعديل tsconfig.e2e.json لكل هذا التعليق. ظهرت مشكلتي عند التحديث من Angular 4 إلى 5 في مشروع يديره CLI.
https://github.com/angular/protractor/issues/4176#issuecomment -310610380

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

أدى تثبيت @types/jasminewd2 حل المشكلة بالنسبة لي

بالنسبة لي ، نجح تعديل tsconfig.e2e.json لكل هذا التعليق. ظهرت مشكلتي عند التحديث من Angular 4 إلى 5 في مشروع يديره CLI.
الزاوي / منقلة # 4176 (تعليق)

تثبيت @types/jasminewd2 والقيام بذلك هو الحل الصحيح.

إشعار تثبيت @types/jasminewd2 __IS NOT__ إجابة صحيحة:

  • jasminewd2 ليس بالضرورة متوافقًا مع كتابة الياسمين لـ v3 ، لأنه يستهدف jasmine v2
  • سبب نجاحه هو مجرد مصادفة ، حيث أنهم any -d جميع المدخلات.

الجواب الصحيح إما:

  • في انتظار النتيجة كما هو موضح هنا
  • تمديد كتابات المنقلة أو إنشاء حزمة طباعة جديدة من شأنها أن تمد الياسمين بشكل صحيح
  • استخدم expectAsync المتوفر بأحدث الياسمين.
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات