<p>jest.clearAllMocks () ، لا يزيل التطبيق الوهمي داخل "afterEach"</p>

تم إنشاؤها على ١٠ أكتوبر ٢٠١٨  ·  44تعليقات  ·  مصدر: facebook/jest

🐛 تقرير الشوائب

jest.clearAllMocks () ، لا يزيل التطبيق الوهمي داخل afterEach

لإعادة إنتاج

لدي ملف يسمى src / Layouts / index.js

// ./src/layouts/index.js
const importAll = (r) =>
    r.keys().reduce(
        (acc, key) => ({
            ...acc,
            [key.replace(/^\.\/(.*).json$/, '$1')]: r(key)
        }),
        {}
    );

module.exports = importAll(require.context('./', true, /\.json$/));

إنه يستخدم webpack require.context لذلك أحاول السخرية من jest.mock.

لدي ملف آخر ... قل الملف util.js

//./src/util.js
import layouts from '../layouts';
export const getLayout(name) {
  return layouts[name];
}

في الاختبار الذي أجريته ، أحاول مسح الزخارف بعد كل اختبار

//./src/util.test.js
describe('my test suite', () => {
  afterEach(() => {
     jest.clearAllMocks();
  })
  test('test number one', () => {
      jest.mock('./layouts', () => ({
          layout1 : { a : 1 },
          layout2 : { b: 2 },
     }));
     assert.equals(getLayout('layout1').a, 1);
     assert.equals(getLayout('layout2').b, 2);
  });
  test('test number two', () => {
     assert.equals(getLayout('layout1').a, 1);
     assert.equals(getLayout('layout2').b, 2);
  });
});

سلوك متوقع

أتوقع أن يجتاز الاختبار الأول والاختبار الثاني يفشل ... لأنه كان من المفترض أن يتم مسح النموذج.

رابط للاستبدال أو الريبو (موصى به للغاية)

https://repl.it/@CharlieHoover/SorrowfulBackSandboxes

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

لمعلوماتك ، فإن التوثيق الساخر وواجهة برمجة التطبيقات (API) غير واضح للغاية ، ومعقد للغاية IMHO.

ال 44 كومينتر

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

لمعلوماتك ، فإن التوثيق الساخر وواجهة برمجة التطبيقات (API) غير واضح للغاية ، ومعقد للغاية IMHO.

jest.clearAllMocks لا يزيل التطبيقات الوهمية حسب التصميم - جرب jest.resetAllMocks

فيما يلي المستندات ذات الصلة:


لا يزال لا يعمل مع resetAllMocks:

يشمل المثال:

https://repl.it/@CharlieHoover/SorrowfulBackSandboxes -2

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

rickhanlonii لم يتم الرد على

آه ، نعم ، يبدو أن resetAllMocks لا تعيد تعيين mock _module plants_ فقط للتطبيقات التي حددها mockImplementation. إذا كنت ترغب في نشر ما تريد القيام به للتكديس ، يمكنني مساعدتك في فعل ما تريده هناك ولكن لا يبدو أن هناك خطأ هنا

لماذا لا تقوم وظيفة تسمى clearAllMocks بمسح mocks

أعتقد أن الالتباس يكمن في أن كلمة "mock" في "clearAllMocks" لا تشير إلى تطبيقات وهمية ، بل تشير إلى كائنات Jest الوهمية. لذا فإن هذه الوظيفة تعني "امسح جميع الكائنات المزيفة المزيفة" أي استدعاء .mockClear في جميع الكائنات الوهمية (أي امسح المكالمات)

تضمين التغريدة

omg لذا يبدو أنه يتم استخدام "clear" و "reset" على عكس المعنى المنطقي لكل منهما.

أيضًا ، من الواضح جدًا ما الذي يحاول فعله ؛ إزالة التنفيذ الوهمي ، وأنت تقول أنه لا توجد طريقة للقيام بذلك orrr ..... ؟؟؟؟؟

يجب إعادة فتح هذا

+1

+1

+1

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

+1

أيضا تكافح مع هذا!

+1 يرجى تحديث المستندات لشرح كيفية إزالة وهمية / تجسس

+1 يرجى تحديث المستندات لشرح كيفية إزالة وهمية / تجسس

أليس هذا ما هو mockRestore؟ https://jestjs.io/docs/en/mock-function-api#mockfnmockrestore

أعتقد أن التكوين الافتراضي يجب أن يشمل:

{
  restoreMocks: true,
  clearMocks: true,
  resetMocks: true
} 

إنه لأمر مروع أن السلوك الافتراضي هو حالة القيء بين الاختبارات. هل يمكنك من فضلك إبقاء اختباراتي معزولة بشكل افتراضي؟ ثم يمكن لـ [الأقلية المأمولة] الذين يرغبون في نشر الحالة عبر اختبارات متعددة القيام بذلك عن طريق الاشتراك.

"
وصف ('test'، () => {
beforeEach (() => {
const WelcomeService = تتطلب ('./../ SOME_MODULE')
WelcomeServiceSpyOfMessage = jest.spyOn (
مرحبا بالخدمة ،
"message" ، // بعض الوظائف التي سخرت منها
)
const IsUserAuthentic = تتطلب ('./../ SOME_MODULE')
IsUserAuthenticSpyOnIsUserAuthentic = jest.spyOn (
IsUserAuthentic ،
'isUserAuthentic' // بعض الوظائف التي سخرت منها
)
app = يتطلب ('../ src / server') // خادمي Express
})

afterEach(() => {
  jest.restoreAllMocks()
})

it('1. Mock implementation', async () => {
  const mockedMessage = faker.lorem.sentence()
  WelcomeServiceSpyOfMessage.mockImplementation(() => mockedMessage)
  IsUserAuthenticSpyOnIsUserAuthentic.mockImplementation(() => {
    console.log('>>> MOCKED MW 1')
    return true
  })
  const result = await request(app)
    .get('/api')
  expect(result.statusCode).toBe(200)
  expect(result.body).toHaveProperty('message', mockedMessage)
})

it('2. After restored implementation', async () => {
  IsUserAuthenticSpyOnIsUserAuthentic.mockImplementation(() => {
    console.log('>>> MOCKED MW 2')
    return true
  })
  const result = await request(app)
    .get('/api')
  expect(result.statusCode).toBe(200)
  expect(result.body).toHaveProperty('message', 'hello world')
})

})
"
انتاج:
اختبار console.log / route.test.js: 36

MOCKED MW 1

اختبار console.log / route.test.js: 36

MOCKED MW 1

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

شكرا

+1

+1

+1
يبدو لي أن مسح النماذج بعد كل اختبار يجب أن يكون السلوك الافتراضي.

+1
يبدو لي أن مسح النماذج بعد كل اختبار يجب أن يكون السلوك الافتراضي.

+1

الدالات التي تم الاستهزاء بها باستخدام .spyOn() يمكن استعادتها: jest.spyOn(object, method).mockImplementation(mockFunction) .

أوافق على أنه يجب مسح النماذج تلقائيًا بين الاختبارات.

+1

+1

هل هناك حل لهذه المشكلة؟ +1

تواجه نفس المشكلة!

لدي نفس المشكلة لكني لم أجد حلًا من الوثائق الرسمية المزحة.
لذلك أقدم حلًا غير رشيق أدناه. ثم استخدمه في كل مكان يحتاج إلى إزالة الوهمي.

// jestUtil.js
const mockArr = [];
export function doAMock(moduleName, cb = null) {
  if (!mockArr.includes(moduleName)) {
    mockArr.push(moduleName);
  }
  if (cb) {
    jest.doMock(moduleName, cb);
  } else {
    jest.doMock(moduleName);

  }
}

export function removeAllMock() {
  mockArr.forEach(m => {
    jest.dontMock(m);
  });
  mockArr.length = 0;
}


// usage
// other.test.js
import * as jsUtil from './jestUtil.js';
jsUtil.doAMock('module');
jsUtil.removeAllMock();

IMO هذه تسمية API مربكة للغاية وتستحق إعادة تسميتها.

IMO هذه تسمية API مربكة للغاية وتستحق إعادة تسميتها.

نعم ، أوافق تمامًا - لكن ما زلت أتساءل عما إذا كان هذا ممكنًا حاليًا - ضع التسمية جانبًا. إذا كانت الإجابة بنعم ، فكيف؟

يجب أن يتم إصلاح هذا حقا. لا يوجد سبب يجب أن يؤثر اختبار وحدة واحدة على الآخر. هل وجد أي شخص حلاً قابلاً للتطبيق؟ وظائف غريبة حقا.

تحرير: حل بواسطة @ damien-roche لتحديث jest.config.js يعمل جيدًا ، بالإضافة إلى إضافة استدعاء Class.mockImplementation الخاص بي في خطاف beforeEach:

beforeEach(() => {
        CommunicationApi.mockImplementation(() => {
          return {
            getMessagePosition() {
              return new Promise(resolve => {
                resolve({
                  ok: true,
                  Id: '123',
                  json: function () {
                    return null
                  }
                });
              });
            },
            getMessageOptions() {
              return Promise.resolve(expectedMessageOptions);
            },
          };
        });
        getters = createGetters(baseGetters);
        wrapper = createWrapper(getters, actions)
      });

هل سيفعل أي شخص شيئًا حيال هذا؟ انا ايضا اواجه نفس المشكلة.

هذا لا يزال يمثل مشكلة

لدي أيضًا مشكلة في هذا.

لأي شخص يواجه هذا ، لقد قمت بتعيين علامة سطر الأوامر --restoreMocks والتي يمكن أيضًا تعيينها في jest.config.js :

   restoreMocks: true,

كإعداد افتراضي لاختباراتي بحيث تتم استعادة النماذج دائمًا بعد التشغيل التجريبي. ها هو رابط التوثيق: https://jestjs.io/docs/en/configuration#restoremocks -boolean

متفق عليه أنه تقصير غريب يحافظ على الحالة بين اختبارات الوحدة.

ewhauser لا يعمل علم سطر الأوامر ولا خيار التكوين بالنسبة لي. بمجرد أن أسخر من وحدة ما ، فإنها تظل تتعرض للسخرية حتى أكتب عليها:

هل أنت متأكد من أنها تعمل من أجلك؟

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

لقد صادفت للتو mockRestore ، والذي يعمل إذا كنت تستخدم spyOn .

يفعل كل ما يفعله mockFn.mockReset () ، ويستعيد أيضًا التنفيذ الأصلي (غير المزعج).

يكون هذا مفيدًا عندما تريد محاكاة الوظائف في حالات اختبار معينة واستعادة التنفيذ الأصلي في حالات أخرى.

احذر من أن mockFn.mockRestore لا يعمل إلا عندما تم إنشاء النموذج باستخدام jest.spyOn. وبالتالي عليك أن تهتم بالاستعادة بنفسك عند تعيين jest.fn () يدويًا.

يتوفر خيار تكوين استعادة القذائف لاستعادة النماذج تلقائيًا بين الاختبارات.

https://jestjs.io/docs/en/mock-function-api#mockfnmockrestore

لقد وجدت هذا مفيدًا. استدعاء هذه الوظيفة مع انتظار في كل مرة مباشرة بعد أن يُتوقع استدعاء fn تم الاستهزاء به.

flushAllPromises() { return new Promise(resolve => setImmediate(resolve)); }

يجب أن يؤدي هذا إلى إجراء آخر استدعاء لـ YourClass.yourFunction.mockResolvedValue () في حالة الاختبار المنفذة للعمل ، بدلاً من الاعتماد على القيمة التي تم حلها لآخر اختبار للوحدة المنفذة.

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

يجب إعادة تسمية واجهات برمجة التطبيقات هذه. إن قبول التسمية السيئة بسبب القصور الذاتي هو أمر غير مهني على أقل تقدير.

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

يجب إعادة تسمية واجهات برمجة التطبيقات هذه. إن قبول التسمية السيئة بسبب القصور الذاتي هو أمر غير مهني على أقل تقدير.

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

بالنسبة لي ، ساعدني jest.restoreAllMocks(); أخيرًا في تصفية الجاسوس المزاح

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