واجهت مشكلة في محاولة السخرية من طريقة فئة ثابتة في 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 الساخر هو الذي يجعل هذا يحدث؟
يجب أن يكون التأكيد الصحيح هو 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.
أخبرني إذا لم يؤد ذلك إلى حل مشكلتك.
التعليق الأكثر فائدة
Jest يعيد تعيين سجل الوحدة النمطية في كل مكالمة إلى
it
. أنت تطلبApiWrapper
في الأعلى وHelper
بالداخل قبل كل منهما ، لذلك من المحتمل أن يتلقى المساعد نسخة مختلفة منApiWrapper
. لإصلاحها يمكنك:beforeEach
شرح مبسط:
أخبرني إذا لم يؤد ذلك إلى حل مشكلتك.