Jest: الاستهزاء بأساليب الطبقة الثابتة

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

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

تم النشر عبر http://stackoverflow.com/questions/38206478/mocking-methods-in-jest

لديّ اختبار وحدة بسيط للغاية يبدو كالتالي:

import ApiWrapper from '../../services/api_wrapper';
jest.unmock('../helper')

describe('Helper', () => {
    let Helper;

    beforeEach(() => {
        Helper = require('../helper').default;
    });

    it('calls the Api Wrapper', () => {
        Helper.help()

        expect(ApiWrapper.help).toHaveBeenCalled();
    });

});

حيث يبدو المساعد مثل هذا:

import ApiWrapper from '../services/api_wrapper'
class Helper {
    help() {
        ApiWrapper.help()
    }
}

export default new Helper();

ويبدو ApiWrapper كما يلي:

class ApiWrapper {
  static help () {
     console.log('help!')
  }
}
export default ApiWrapper;

ApiWrapper.help () يتعرض للسخرية من Jest لذا "مساعدة!" لا تتم طباعته ، لكن التوقع في الاختبار يفشل. لا يزال هذا يفشل إذا أعدنا كتابة ApiWrapper ليكون مجرد كائن Javascript عادي مثل:

export default {
    help: () => { console.log('help!'); }
}

ومع ذلك ، فإنه يعمل ، إذا قمنا بتغيير الواردات في المواصفات (لذلك يتم استيراد ApiWrapper في beforeEach) ، وأعدنا كتابة ApiWrapper ليكون فئة Singleton ، مثل:

class ApiWrapper {
   help() {
      console.log('help!');
   }
}();

export default new ApiWrapper();

ما الذي يجعل سلوك Jest الساخر هو الذي يجعل هذا يحدث؟

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

Jest يعيد تعيين سجل الوحدة النمطية في كل مكالمة إلى it . أنت تطلب ApiWrapper في الأعلى و Helper بالداخل قبل كل منهما ، لذلك من المحتمل أن يتلقى المساعد نسخة مختلفة من ApiWrapper . لإصلاحها يمكنك:

  • قم باستيراد كلا الفئتين في الأعلى.
  • طلب كلا الفئتين في beforeEach

شرح مبسط:

var A = require('A');
jest.resetModuleRegistry();
A !== require('A'); // true, A is not the exact same module as before we reset the registry.

أخبرني إذا لم يؤد ذلك إلى حل مشكلتك.

ال 3 كومينتر

يجب أن يكون التأكيد الصحيح هو toBeCalled . هل يمكنك تجربة ذلك؟

آسف ، هذا ما قصدته. لقد كتبت المثال في Stackoverflow مباشرة.

Jest يعيد تعيين سجل الوحدة النمطية في كل مكالمة إلى it . أنت تطلب ApiWrapper في الأعلى و Helper بالداخل قبل كل منهما ، لذلك من المحتمل أن يتلقى المساعد نسخة مختلفة من ApiWrapper . لإصلاحها يمكنك:

  • قم باستيراد كلا الفئتين في الأعلى.
  • طلب كلا الفئتين في beforeEach

شرح مبسط:

var A = require('A');
jest.resetModuleRegistry();
A !== require('A'); // true, A is not the exact same module as before we reset the registry.

أخبرني إذا لم يؤد ذلك إلى حل مشكلتك.

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