Jest: اختبر ما إذا كان الكائن أو المصفوفة أو السلسلة.

تم إنشاؤها على ٣ مايو ٢٠١٧  ·  29تعليقات  ·  مصدر: facebook/jest

هل هناك طريقة للتحقق مما إذا كان المكون كائنًا أو مصفوفة أو سلسلة؟ سيكون هذا مشابهًا لـ chai 'should.be.a' على سبيل المثال: validationResult.SSN [0] .should.be.a ('سلسلة').

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

امتداد toBeType بسيط لمن يريده

expect.extend({
    toBeType(received, argument) {
        const initialType = typeof received;
        const type = initialType === "object" ? Array.isArray(received) ? "array" : initialType : initialType;
        return type === argument ? {
            message: () => `expected ${received} to be type ${argument}`,
            pass: true
        } : {
            message: () => `expected ${received} to be type ${argument}`,
            pass: false
        };
    }
});

describe("testing extended expect", () => {
    it("tests normal types correctly", () => {
        expect("").toBeType("string");
        expect({}).toBeType("object");
        expect(1).toBeType("number");
    });
    it("tests array types correctly", () => {
        expect([]).toBeType("array");
    });
    it("works with promises", () => {
        expect(Promise.resolve([])).resolves.toBeType("array");
    });
});

بسيط جدا في التنفيذ. حقا ينبغي أن يكون في جوهر tbh.

ملاحظة - إذا كنت تضع هذا الامتداد في ملفات الإعداد الخاصة بك ، فأنت تريده في setupTestFrameworkScriptFile NOT setupFiles (حيث أن الامتداد متاح فقط في السابق)

ال 29 كومينتر

لا ، لا يوجد. ستجد قائمة بجميع أدوات المطابقة المتاحة هنا: https://facebook.github.io/jest/docs/en/expect.html

يمكنك أيضًا استخدام JavaScript عادي أو مكتبة مساعدة مثل lodash لذلك:

test('name', () => {
  // array
  expect(Array.isArray(['value'])).toBe(true);
  // string
  expect(typeof 'value').toBe('string');
  // object
  expect({value: 'value'}).toBeTruthy();
  expect(typeof {value: 'value'}).toBe('object');
})

نقطة ثانوية - هذا لا يساعد في تحقيق نتائج واعدة.

expect(somePromise).resolves.toBe(...) في هذه المرحلة لا توجد طريقة للتحقق من النوع. إذا كنت لا تهتم ما هي محتويات ولكن مجرد أنه هو سلسلة. كنت آمل أن يكون expects.stringContaining("") عملاً ولكن هذا لا يعمل أيضًا.

abritinthebay أنا بالضبط هذا الموقف وهذه هي النتيجة الأولى في Google ، فربما يجب إعادة فتح هذا؟

بالتأكيد يجب التفكير في الأمر أكثر قليلاً. كان الحل البديل الخاص بي هو الإضافة إلى السلسلة بحيث يقوم بالجزء typeof . على سبيل المثال:

expect(somePromise.then(data => typeof data)).resolves.toBe("object");

إنه يعمل ، لكنه ليس نظيفًا تمامًا.

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

فشل هذا expect(Array.isArray(['value'])).toBe(false); مع

expect(received).toBe(expected)
    Expected value to be (using ===):
      false
    Received:
      true. 

لذلك إما أن نحصل على رسائل تأكيد فظيعة أو يتعين علينا توسيع Jest لدعم هذه الأنواع من عمليات التحقق. أليس من المنطقي أن يقوم المشرفون على Jest بذلك مرة واحدة بدلاً من أن يقوم كل شخص يستخدم هذه الميزات بتنفيذها بمفرده؟

قم بإنشاء المطابقات الخاصة بك باستخدام expect.extend ثم انشرها كوحدة npm. إذا أصبحت شائعة ، فقد ندمجها في Jest core في النهاية ؛)

امتداد toBeType بسيط لمن يريده

expect.extend({
    toBeType(received, argument) {
        const initialType = typeof received;
        const type = initialType === "object" ? Array.isArray(received) ? "array" : initialType : initialType;
        return type === argument ? {
            message: () => `expected ${received} to be type ${argument}`,
            pass: true
        } : {
            message: () => `expected ${received} to be type ${argument}`,
            pass: false
        };
    }
});

describe("testing extended expect", () => {
    it("tests normal types correctly", () => {
        expect("").toBeType("string");
        expect({}).toBeType("object");
        expect(1).toBeType("number");
    });
    it("tests array types correctly", () => {
        expect([]).toBeType("array");
    });
    it("works with promises", () => {
        expect(Promise.resolve([])).resolves.toBeType("array");
    });
});

بسيط جدا في التنفيذ. حقا ينبغي أن يكون في جوهر tbh.

ملاحظة - إذا كنت تضع هذا الامتداد في ملفات الإعداد الخاصة بك ، فأنت تريده في setupTestFrameworkScriptFile NOT setupFiles (حيث أن الامتداد متاح فقط في السابق)

شكرا abritinthebay

لذا فقد اختتمت ذلك في وحدة npm إذا أراد الناس ذلك:

https://www.npmjs.com/package/jest-tobetype

describe("assertion framework", ()=> {
 it("should check primitive types", () => {
   expect(expect.toBeA).toBeA("function")
  })
})

فشل: توقع (...). toBeA ليست وظيفةTypeError: توقع (...). toBeA ليست دالة

يحتوي https://github.com/jest-community/jest-extended على كل أنواع المطابقات التي قد تريدها (على ما أعتقد).

كنت أستخدم toBeInstanceOf في اختباراتي:

expect($wrapper.vm.countries).toBeInstanceOf(Array);

قم بإنشاء المطابقات الخاصة بك باستخدام يتوقع.extend ثم نشر كوحدة npm. إذا أصبحت شائعة ، فقد ندمجها في Jest core في النهاية ؛)

نعم ، وقد تكتب إطار الدعابة الخاص بك ، أثناء تواجدك فيه.

قد يتصدر هذا واحد فقط أسوأ الإجابات التي يمكنك الحصول عليها على GitHub.

لذلك فعل abritinthebay بالضبط ما طلبه thymikee (والذي كان أكثر بكثير من طلب السحب القياسي).

الآن بعد أن أنجزت تلك الروح الشجاعة كل العمل ، متى يمكن لبقيتنا الحصول على هذا المطابق أخيرًا (دون الحاجة إلى تثبيت مكتبة أخرى)؟ هل لا يزال القائمون على الصيانة يدفعون بفكرة أن هذا لا ينتمي إلى Jest ، أم أن هذا قد سقط عن رادارهم؟

نحن صارمون جدًا فيما يتعلق بما يجعلها جوهرية ولا نضيف عادةً أدوات مطابقة السكر. Jest core هي بنية كبيرة إلى حد ما وكل أداة مطابقة نضيفها تزيد من تكلفة الصيانة

بالنسبة للسكر ، نوصي عمومًا بـ https://github.com/jest-community/jest-extended

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

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

.to.be.an.instanceOf هو عدد المستخدمين الذين يفكرون في التحقق من الأنواع ، لذلك بالنسبة لهؤلاء المستخدمين ، حتى لو كنت تراها على أنها سكر ، فأنت تحرمهم فعليًا من القدرة على التحقق من الأنواع في Jest بدون مكتبة إضافية.

نعم أسمعك. لأكون واضحًا ، أعني بكلمة "sugar" بناء الجملة المصمم لتسهيل قراءة الأشياء أو التعبير عنها . السكر ، بحكم تعريفه ، هو شكل مختلف لميزة موجودة بالفعل

في هذه الحالة ، لدينا:

// Supported
expect(typeof foo).toBe('string');

// Proposed Sugar
expect(foo).toBeType('string');

لذلك ليس الأمر أننا لا ندعم أنواع الفحص. نحن نفعل. نحن نؤيد الخيار الأول. يستخدم هذا الخيار أداة المطابقة الأساسية toBe والتي أمضينا وقتًا طويلاً في إصلاح الأخطاء فيها وتعديل الرسالة من أجلها ، بحيث يتمتع المستخدمون بتجربة جيدة

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

لكي نكون منصفين تمامًا - معظم المطابقات هم "سكر" على مستوى ما. أعني أن toBeGreaterThanOrEqual هو مجرد سكر مقابل expect(foo >= bar).toBe(true);

المطابقات هي في الحقيقة _ تقريبًا كل_ السكر حول العبارات المنطقية ؛)

(أقول هذا ليس للحفر ، فقط للإشارة إلى أنه ... خط غير واضح للغاية)

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

استمع إلينا أو لا تستمع إلينا ، مرة أخرى بصفتك مشرفًا ، لديك الكثير من المخاوف الأخرى. لكنني لا أعتقد أن الرد الصحيح هو أن تأتي بالقول "إن ما لديك هو مجرد سكر غير ضروري بطبيعته" (هذا أنا أحاول إعادة صياغتك ، وليس محاولة وضع الكلمات في فمك) عندما لا تكون متأصلة: إنها مكالمتك بنسبة 100٪ سواء كانت الدعابة يمكن التحقق من جميع الأنواع أو عدم الخروج من منطقة الجزاء.

ماذا عن ، أليس هذا صعبًا: P؟

expect(Array.isArray(['your', 'array'])).toBe(true);

expect(typeof something === "object").toBe(true); 
// - or -
expect(something instanceof Object).toBe(true);

expect(typeof something === "string").toBe(true); 

nahumzs بينما يعمل ، تكمن المشكلة في أنه في مخرجات الاختبار الخاصة بك عند الفشل ، سيقول "توقع خطأ ليكون صحيحًا" ، وهذا ليس مفيدًا جدًا ؛)

اظن هذه هي الطريقة :)

describe('type check', () => {
    test('should be type string', () => {
        expect(typeof '').toBe('string')
    })

    test('should be type number', () => {
        expect(typeof 10).toBe('number')
    })

    test('should be type boolean', () => {
        expect(typeof true).toBe('boolean')
    })

    test('should be type undefined', () => {
        expect(typeof undefined).toBe('undefined')
    })

    test('should be type object', () => {
        expect(typeof { foo: 'bar' }).toBe('object')
    })

    test('should be type function', () => {
        expect(typeof function() {}).toBe('function')
    })

    test('should be type null', () => {
        expect(typeof null).toBe('object')
    })
})

لقد أعدت تشكيل التنفيذ المقدم منabritinthebay. يبدو لي مريحًا بعض الشيء في العمل معه.

`` جافا سكريبت
توقع.امتداد ({
/ ** تم استلام
* param {string | string []} arg
* return {{pass: boolean، message: (function (): string)}}
* /
toBeType (تم استلامه ، وسيطة) {
const isCorrectType = arg => {
const ReceivedType = typeof المستلمة ؛

        const checkForSingle = arg => {
            const type = receivedType === 'object'
                ? Array.isArray(received)
                    ? 'array'
                    : receivedType
                : receivedType;

            return type === arg;
        };

        const checkForArr = arg => {
            const reducer = (prev, curr) => prev || isCorrectType(curr).isCorrect;

            return arg.reduce(reducer, false);
        };

        return {
            receivedType,
            isCorrect: Array.isArray(arg)
                ? checkForArr(arg)
                : checkForSingle(arg)
        };
    };

    const {isCorrect, receivedType} = isCorrectType(arg);

    return {
        pass: isCorrect,
        message: () => {
            const toBe = Array.isArray(arg)
                ? arg.join(`' or '`)
                : arg;

            return `Expected '${received}' of '${receivedType}' type to be of '${toBe}' type(s)`;
        }
    };
}

}) ؛

يجب عليك التحقق من الوحدة الخاصة بي (مرتبطة أعلاه). إنها تفعل أكثر من ذلك بقليل. ولكن إذا كان ذلك يناسبك: فاستخدمه!

اظن هذه هي الطريقة :)

describe('type check', () => {
    test('should be type string', () => {
        expect(typeof '').toBe('string')
    })

    test('should be type number', () => {
        expect(typeof 10).toBe('number')
    })

    test('should be type boolean', () => {
        expect(typeof true).toBe('boolean')
    })

    test('should be type undefined', () => {
        expect(typeof undefined).toBe('undefined')
    })

    test('should be type object', () => {
        expect(typeof { foo: 'bar' }).toBe('object')
    })

    test('should be type function', () => {
        expect(typeof function() {}).toBe('function')
    })

    test('should be type null', () => {
        expect(typeof null).toBe('object')
    })
})

إنه يعمل مثل السحر بالإضافة إلى أنه أكثر قابلية للقراءة والصيانة للمستقبل.

اظن هذه هي الطريقة :)

describe('type check', () => {
    test('should be type string', () => {
        expect(typeof '').toBe('string')
    })

    test('should be type number', () => {
        expect(typeof 10).toBe('number')
    })

    test('should be type boolean', () => {
        expect(typeof true).toBe('boolean')
    })

    test('should be type undefined', () => {
        expect(typeof undefined).toBe('undefined')
    })

    test('should be type object', () => {
        expect(typeof { foo: 'bar' }).toBe('object')
    })

    test('should be type function', () => {
        expect(typeof function() {}).toBe('function')
    })

    test('should be type null', () => {
        expect(typeof null).toBe('object')
    })
})
    test('should be type object', () => {
        expect(typeof { foo: 'bar' }).toBe('object')
        // passes
        expect(typeof ['foo', 'bar']).toBe('object')
        // passes
        expect(typeof null).toBe('object')
    })

😞

لهذا السبب أقترح الملحق الخاص بي أعلاه: يعتني بهذا.

InstanceOf أفضل قليلاً ولكنه عرضة لمشاكل مماثلة.

ارتباط به:

https://www.npmjs.com/package/jest-tobetype

شكرا على الحل abritinthebay

حل آخر:

expect('example').toEqual(expect.any(String));
expect(123).toEqual(expect.any(String));

الثانية ستفشل مع:

    Expected: Any<String>
    Received: 123
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات