নোড.জেএস মডিউলটিকে কীভাবে ইউনিট করতে হবে যাতে অন্যান্য মডিউলগুলির প্রয়োজন হয় এবং কীভাবে বিশ্বব্যাপী ব্যঙ্গ করতে হবে ফাংশন প্রয়োজন?


156

এটি একটি তুচ্ছ উদাহরণ যা আমার সমস্যার চূড়ান্ত চিত্র তুলে ধরে:

var innerLib = require('./path/to/innerLib');

function underTest() {
    return innerLib.doComplexStuff();
}

module.exports = underTest;

আমি এই কোডের জন্য একটি ইউনিট পরীক্ষা লেখার চেষ্টা করছি। আমি কিভাবে প্রয়োজনীয়তা আউট উপহাস করতে innerLibআউট উপহাস ছাড়া requireসম্পূর্ণরূপে ফাংশন আছে?

সুতরাং এটি আমি গ্লোবালটিকে উপহাস করার চেষ্টা করছি requireএবং এটি সন্ধানে এটি কার্যকর হবে না তা খুঁজে বের করার চেষ্টা করছি:

var path = require('path'),
    vm = require('vm'),
    fs = require('fs'),
    indexPath = path.join(__dirname, './underTest');

var globalRequire = require;

require = function(name) {
    console.log('require: ' + name);
    switch(name) {
        case 'connect':
        case indexPath:
            return globalRequire(name);
            break;
    }
};

সমস্যাটি হ'ল ফাইলটির requireভিতরে থাকা ফাংশনটি underTest.jsআসলে উপহাস করা হয়নি। এটি এখনও বিশ্বব্যাপী requireফাংশনকে নির্দেশ করে। সুতরাং মনে হচ্ছে যে আমি যে requireফাইলটি উপহাস করছি তার মধ্যেই আমি কেবল ফাংশনটি উপহাস করতে পারি I আমি যদি requireস্থানীয় কপিটি ওভাররাইড করার পরেও কোনও কিছু অন্তর্ভুক্ত করতে বিশ্বব্যাপী ব্যবহার করি তবে প্রয়োজনীয় ফাইলগুলি এখনও থাকবে গ্লোবাল requireরেফারেন্স।


আপনাকে ওভাররাইট করতে হবে global.require। ভেরিয়েবলগুলি moduleমডিউলগুলি স্কোপড হওয়ায় ডিফল্টরূপে লেখেন ।
রায়নস

@ রায়নস আমি কীভাবে এটি করব? Global.require অপরিবর্তিত? এমনকি যদি আমি এটি আমার নিজস্ব ফাংশন দিয়ে প্রতিস্থাপন করি তবে অন্যান্য ফাংশনগুলি কখনই সেগুলি ব্যবহার করবে না?
এইচএমআর

উত্তর:


174

এখন তুমি পারো!

আমি প্রক্সিয়ার প্রকাশ করেছি যা আপনি যখন পরীক্ষা করছেন এটি আপনার মডিউলের অভ্যন্তরে গ্লোবাল প্রয়োজনীয়তা ওভাররাইড করার যত্ন নেবে।

এর অর্থ হল প্রয়োজনীয় মডিউলগুলির জন্য মক ইনজেকশন করার জন্য আপনার কোডে কোনও পরিবর্তন দরকার নেই

প্রক্সিওয়ারের একটি খুব সহজ এপিআই রয়েছে যা আপনি মডিউলটি পরীক্ষা করার চেষ্টা করছেন এবং একটি সাধারণ পদক্ষেপে প্রয়োজনীয় মডিউলগুলির জন্য মক / স্টাব বরাবর পাস করার চেষ্টা করছেন res

@ রায়নস ঠিক বলেছেন যে traditionতিহ্যগতভাবে আপনি এটি অর্জন করতে বা পরিবর্তে নীচের অংশে উন্নয়নের জন্য খুব আদর্শ সমাধানগুলি অবলম্বন করতে হয়েছিল

আমি প্রক্সিওয়্যার তৈরির মূল কারণটি - কোন ঝামেলা ছাড়াই টপ-ডাউন পরীক্ষা চালিত বিকাশের অনুমতি দেওয়ার জন্য।

ডকুমেন্টেশন এবং উদাহরণগুলি দেখুন যাতে এটি আপনার প্রয়োজনের সাথে মানানসই হয় g


5
আমি প্রক্সিওয়্যার ব্যবহার করি এবং আমি যথেষ্ট ভাল জিনিস বলতে পারি না। এটা আমাকে বাঁচায়! আমাকে অ্যাপিলারেটর টাইটানিয়ামে বিকাশযুক্ত অ্যাপের জন্য জুঁই-নোড পরীক্ষা লেখার দায়িত্ব দেওয়া হয়েছিল যা কিছু মডিউলকে পরম পথ এবং অনেকগুলি বিজ্ঞপ্তি নির্ভরতা হতে বাধ্য করে। প্রক্সিওয়্যারটি আমাকে সেই ফাঁকগুলি থামাতে দাও এবং প্রতিটি পরীক্ষার জন্য আমার যে ক্রুফ্টের প্রয়োজন ছিল না তা উপহাস করুক। ( এখানে ব্যাখ্যা করা হয়েছে ) আপনাকে অনেক ধন্যবাদ!
সুকিমা

প্রক্সিউইয়ার আপনাকে আপনার কোডটি সঠিকভাবে পরীক্ষা করতে সহায়তা করে শুনে খুশি :)
থারস্টেন লরেঞ্জ

1
খুব সুন্দর @ থার্সটেনলরেঞ্জ, আমি ডিফ করব। ব্যবহার করা proxyquire!
bevacqua

ফ্যান্টাস্টিক! যখন আমি গৃহীত উত্তরটি দেখেছি যে "আপনি পারবেন না" আমি ভেবেছিলাম "হে Godশ্বর, সিরিয়াসলি ?!" কিন্তু এটি সত্যিই এটি সংরক্ষণ করেছে।
চাদউইক

3
আপনারা যারা ওয়েবপ্যাক ব্যবহার করছেন তাদের জন্য প্রক্সি অনুসন্ধানের জন্য সময় ব্যয় করবেন না। এটি ওয়েবপ্যাক সমর্থন করে না। আমি পরিবর্তে ইনজেকশন-লোডার অনুসন্ধান করছি ( github.com / প্লাস্টিকিন / ইনজেকশন-লোডার )।
আরতিফ

116

এক্ষেত্রে আরও ভাল বিকল্প হ'ল মডিউলটি ফিরে আসার পদ্ধতিগুলি উপহাস করা।

আরও ভাল বা খারাপের জন্য, বেশিরভাগ নোড.জেএস মডিউলগুলি সিলেটলেটন; দুটি টুকরা কোডের জন্য () একই মডিউলের একই মডিউলটির একই রেফারেন্স পাওয়া যায়।

আপনি এটি উপার্জন করতে পারেন এবং প্রয়োজনীয় আইটেমগুলিকে বিদ্রূপ করার জন্য সিননের মতো কিছু ব্যবহার করতে পারেন । মোচা পরীক্ষা নিম্নলিখিত:

// in your testfile
var innerLib  = require('./path/to/innerLib');
var underTest = require('./path/to/underTest');
var sinon     = require('sinon');

describe("underTest", function() {
  it("does something", function() {
    sinon.stub(innerLib, 'toCrazyCrap').callsFake(function() {
      // whatever you would like innerLib.toCrazyCrap to do under test
    });

    underTest();

    sinon.assert.calledOnce(innerLib.toCrazyCrap); // sinon assertion

    innerLib.toCrazyCrap.restore(); // restore original functionality
  });
});

সিউনের দৃser়তা তৈরির জন্য চায়ের সাথে ভাল সংহতকরণ রয়েছে এবং আমি সহজে স্পাই / স্টাব ক্লিনআপ (পরীক্ষার দূষণ এড়াতে) মোনার সাথে সিননকে সংহত করার জন্য একটি মডিউল লিখেছিলাম )

নোট করুন যে আন্ডার টেস্ট একইভাবে উপহাস করা যায় না, কারণ আন্ডার টেস্ট কেবল কোনও ফাংশন দেয়।

আর একটি বিকল্প হ'ল জেস্ট মক ব্যবহার করা। তাদের পৃষ্ঠায় অনুসরণ করুন


1
দুর্ভাগ্যক্রমে, নোড.জেএস মডিউলগুলি সিঙ্গেলটনের
ফ্রন্টিয়ারপাইকো

4
@ ফ্রন্টিয়ারপাইকো কয়েকটি জিনিস: প্রথমত, যতক্ষণ পরীক্ষার বিষয়, নিবন্ধটি অপ্রাসঙ্গিক। যতক্ষণ আপনি আপনার নির্ভরতাগুলি পরীক্ষা করে (এবং নির্ভরতার নির্ভরতা না) আপনার require('some_module')সমস্ত কোড একই জিনিসটি ফিরে পেতে চলেছে যখন আপনি সমস্ত কোড একই নোড_মডিউলগুলি ভাগ করে। দ্বিতীয়ত, নিবন্ধটি সিঙ্গেলটনের সাথে নেমস্পেসে বিভ্রান্ত করছে যা অরথোগোনাল বাছাই। তৃতীয়ত, নিবন্ধটি বেশ সুন্দর পুরানো (যতদূর নোড.জেএস সম্পর্কিত) তাই দিনের বেলা যা বৈধ হতে পারে তা সম্ভবত বৈধ নয়।
ইলিয়ট ফস্টার 21

2
হুঁ। যদি না কেউ আমাদের কাছে সত্যই একটি কোড বা অন্যটি প্রমাণ করে এমন কোড খনন করে থাকে তবে আমি আপনার নির্ভরতা ইনজেকশনের সমাধানটি নিয়ে যেতে পারি, বা কেবল কেবল চারপাশে অবজেক্টগুলি পাস করি না, এটি নিরাপদ এবং আরও ভবিষ্যতের প্রমাণ।
ফ্রন্টিয়ারপাইকো

1
আমি নিশ্চিত না আপনি যা প্রমাণ করতে বলছেন। নোড মডিউলগুলির একক (ক্যাশেড) প্রকৃতি সাধারণত বোঝা যায়। নির্ভরতা ইনজেকশন, যদিও একটি ভাল রুট, মোটামুটি পরিমাণে বেশি বয়লার প্লেট এবং আরও কোড হতে পারে। স্থিতিশীলভাবে টাইপ করা ভাষাগুলিতে ডিআই আরও সাধারণ, যেখানে আপনার কোডটিতে গতিশীলভাবে হাঁস-পাঞ্চ স্পাই / স্টাব / বিদ্রূপ করা শক্ত। একাধিক প্রকল্প যা আমি গত তিন বছরে করেছি আমার উত্তরটিতে বর্ণিত পদ্ধতিটি ব্যবহার করে। এটি সমস্ত পদ্ধতির মধ্যে সহজতম, যদিও আমি এটিকে অল্প পরিমাণে ব্যবহার করি।
এলিয়ট ফস্টার 15 ই

1
আমি আপনাকে sinon.js পড়তে পরামর্শ দিচ্ছি। আপনি sinon ব্যবহার করেন, তাহলে (উপরে উদাহরণ হিসাবে) আপনি হয় would innerLib.toCrazyCrap.restore()কল sinon মাধ্যমে এবং restub, অথবা sinon.stub(innerLib, 'toCrazyCrap')কীভাবে শহরের উপর অসম্পূর্ণ নিবন্ধ আচরণ করবে আপনি পরিবর্তন করতে অনুমতি দেয়: innerLib.toCrazyCrap.returns(false)। এছাড়াও, পুনর্নির্মাণটি proxyquireউপরের এক্সটেনশনের মতো অনেকটাই একই বলে মনে হচ্ছে ।
এলিয়ট ফস্টার

11

আমি মক-প্রয়োজনীয় ব্যবহার করি । requireমডিউলটি পরীক্ষা করার আগে আপনি নিশ্চিত করেছেন যে আপনি আপনার মকগুলি সংজ্ঞায়িত করেছেন ।


সরাসরি (<ফাইল>) বা স্টপআল () এখনই করা ভাল, যাতে আপনি কোনও পরীক্ষায় কোনও ক্যাশেড ফাইল পান না যেখানে আপনি মক চান না।
জাস্টিন ক্রুসে

1
এটি একটি টন সাহায্য করেছে।
প্রাচীরের

2

বিদ্রূপ requireকরা আমার কাছে খারাপ লাগার মতো মনে হচ্ছে। আমি ব্যক্তিগতভাবে এড়াতে চেষ্টা করব এবং কোডটিকে আরও পরীক্ষামূলক করার জন্য এটি রিফ্যাক্টর করব। নির্ভরতা পরিচালনা করার জন্য বিভিন্ন পদ্ধতি রয়েছে।

1) আর্গুমেন্ট হিসাবে নির্ভরতা পাস

function underTest(innerLib) {
    return innerLib.doComplexStuff();
}

এটি কোড সর্বজনীন পরীক্ষারযোগ্য করে তুলবে। খারাপ দিকটি হ'ল আপনাকে চারপাশে নির্ভরতাগুলি পাস করতে হবে যা কোডটিকে আরও জটিল দেখায়।

২) মডিউলটিকে শ্রেণি হিসাবে বাস্তবায়ন করুন, তারপরে নির্ভরতা অর্জনের জন্য শ্রেণি পদ্ধতি / বৈশিষ্ট্যগুলি ব্যবহার করুন

(এটি একটি স্বীকৃত উদাহরণ, যেখানে শ্রেণীর ব্যবহার যুক্তিসঙ্গত নয়, তবে এটি ধারণাটি প্রকাশ করে) (ES6 উদাহরণ)

const innerLib = require('./path/to/innerLib')

class underTestClass {
    getInnerLib () {
        return innerLib
    }

    underTestMethod () {
        return this.getInnerLib().doComplexStuff()
    }
}

এখন আপনি সহজেই getInnerLibআপনার কোডটি পরীক্ষা করার পদ্ধতিটি স্ট্যাব করতে পারেন । কোডটি আরও ভার্বোজ হয়ে ওঠে, তবে এটি পরীক্ষা করা আরও সহজ।


1
আপনার ধারণা হিসাবে এটি হ্যাকি মনে হয় না ... এটি হ'ল বিদ্রূপ করার মূল বিষয়। প্রয়োজনীয় নির্ভরতাগুলি উপহাস করা জিনিসগুলিকে এত সহজ করে তোলে যে এটি কোড কাঠামো পরিবর্তন না করেই বিকাশকারীকে নিয়ন্ত্রণ দেয়। আপনার পদ্ধতিগুলি খুব ভার্জোজ এবং তাই যুক্তিযুক্ত হতে শক্ত। আমি এর চেয়ে প্রক্সিয়ার্কায়ার বা মক-আবশ্যক চয়ন করি; আমি এখানে কোন সমস্যা দেখছি না কোডটি পরিষ্কার এবং সহজেই বোঝা যায় এবং বেশিরভাগ লোকেরা মনে করে যারা এটি পড়ে তারা ইতিমধ্যে লিখিত কোড রয়েছে যা আপনি তাদের জটিল করতে চান। যদি এই লিবগুলি হ্যাকিশ হয়, তবে আপনার সংজ্ঞা দ্বারা মশকরা এবং স্টাবিংও হ্যাকিশ এবং বন্ধ করা উচিত।
ইমানুয়েল মাহুনি

1
নং 1 এর সাথে সমস্যাটি হ'ল আপনি স্ট্যাকের অভ্যন্তরীণ বাস্তবায়ন বিশদটি অতিক্রম করছেন। একাধিক স্তর সহ এটি আপনার মডিউলের গ্রাহক হতে আরও জটিল হয়ে ওঠে। এটি আইওসি পাত্রে যেমন পদ্ধতির মতো কাজ করতে পারে তবে নির্ভরতা স্বয়ংক্রিয়ভাবে আপনার জন্য ইনজেকশন দেওয়া হয় তবে এটি মনে হয় যেহেতু আমরা ইতিমধ্যে আমদানির বিবরণীর মাধ্যমে নোড মডিউলগুলিতে ইনজেকশনের ব্যবস্থা রেখেছি, তখন এটি সেই স্তরে তাদের বিদ্রূপ করতে সক্ষম হবেন বলে বোধ করা যায় makes ।
ম্যাজিট্রেট

1) এটি সমস্যাটিকে কেবল অন্য ফাইলে নিয়ে যায় 2) এখনও অন্য মডিউলটি লোড করে এবং এইভাবে পারফরম্যান্স ওভারহেড চাপিয়ে দেয় এবং সম্ভবত পার্শ্ব প্রতিক্রিয়া সৃষ্টি করে (জনপ্রিয় colorsমডিউলের মতো যা String.prototype
মেসেজ করে

2

আপনি যদি কখনও ঠাট্টা ব্যবহার করেছেন, তবে সম্ভবত আপনি ঠাট্টার মক বৈশিষ্ট্যটির সাথে পরিচিত।

"Jest.mock (...)" ব্যবহার করে আপনি কেবল আপনার কোডটিতে কোথাও প্রয়োজনীয় স্টেটমেন্টে স্ট্রিং নির্দিষ্ট করতে পারেন এবং যখনই কোনও মডিউল প্রয়োজন হয় সেই স্ট্রিংটি ব্যবহার করে পরিবর্তে মক-অবজেক্ট ফিরিয়ে দেওয়া হবে।

উদাহরণ স্বরূপ

jest.mock("firebase-admin", () => {
    const a = require("mocked-version-of-firebase-admin");
    a.someAdditionalMockedMethod = () => {}
    return a;
})

আপনি "ফ্যাক্টরি" -র ফাংশন থেকে ফিরে আসা বস্তুর সাথে "ফায়ারবেস-অ্যাডমিন" এর সমস্ত আমদানি / প্রয়োজনীয়গুলি পুরোপুরি প্রতিস্থাপন করে।

ঠিক আছে, আপনি ঠাট্টা ব্যবহার করার সময় এটি করতে পারেন কারণ ঠাট্টা প্রতিটি মডিউল জুড়ে একটি রানটাইম তৈরি করে যা এটি চালায় এবং মডিউলটিতে প্রয়োজনীয় "হুকড" সংস্করণটি ইনজেক্ট করে দেয়, তবে আপনি এটি রসিকতা ছাড়াই করতে সক্ষম হবেন না।

আমি এটি মক-প্রয়োজনের সাথে অর্জন করার চেষ্টা করেছি তবে আমার জন্য এটি আমার উত্সের নেস্টেড স্তরের জন্য কাজ করে নি। গিথুব সম্পর্কে নিম্নলিখিত সমস্যাটি দেখুন: মোক-আবশ্যক সবসময় মোচার সাথে ডাকা হয় না

এর সমাধানের জন্য আমি দুটি এনপিএম-মডিউল তৈরি করেছি যা আপনি চান তা অর্জন করতে ব্যবহার করতে পারেন।

আপনার একটি ব্যাবেল-প্লাগইন এবং একটি মডিউল মক্কার দরকার।

আপনার .babelrc এ নিম্নলিখিত বিকল্পগুলির সাথে ব্যাবেল-প্লাগ-মক-আবশ্যক প্লাগইন ব্যবহার করুন:

...
"plugins": [
        ["babel-plugin-mock-require", { "moduleMocker": "jestlike-mock" }],
        ...
]
...

এবং আপনার পরীক্ষার ফাইলে এই জাতীয় উপহাস-মত মক মডিউলটি ব্যবহার করুন:

import {jestMocker} from "jestlike-mock";
...
jestMocker.mock("firebase-admin", () => {
            const firebase = new (require("firebase-mock").MockFirebaseSdk)();
            ...
            return firebase;
});
...

jestlike-mockমডিউল এখনও খুব rudimental এবং ডকুমেন্টেশন অনেক আছে না, কিন্তু অনেক কোড পারেন না। আমি আরও সম্পূর্ণ বৈশিষ্ট্য সেট জন্য যে কোন PR প্রশংসা করি। লক্ষ্যটি হ'ল পুরো "jest.mock" বৈশিষ্ট্যটি পুনরায় তৈরি করা।

জেস্ট কীভাবে প্রয়োগ করে তা দেখার জন্য যাতে কেউ "জাস্ট-রানটাইম" প্যাকেজে কোড সন্ধান করতে পারে। উদাহরণস্বরূপ https://github.com/facebook/jest/blob/master/packages/jest-runtime/src/index.js#L734 দেখুন , এখানে তারা একটি মডিউলটির "অটোমক" উত্পন্ন করে।

আশা করি এইটি কাজ করবে ;)


1

আপনি পারবেন না। আপনাকে আপনার ইউনিট টেস্ট স্যুটটি তৈরি করতে হবে যাতে সর্বনিম্ন মডিউলগুলি পরীক্ষা করা হয় এবং মডিউলগুলির জন্য প্রয়োজনীয় উচ্চ স্তরের মডিউলগুলি পরে পরীক্ষা করা হয়।

আপনাকে এটিও ধরে নিতে হবে যে কোনও তৃতীয় পক্ষের কোড এবং নোড.জেএস নিজেই ভালভাবে পরীক্ষিত।

আমি অনুমান করি যে আপনি ঠাট্টা ফ্রেম ফ্রেমগুলি অদূর ভবিষ্যতে অদূর ভবিষ্যতে এসে পৌঁছে দেখতে পাবেন global.require

যদি আপনাকে সত্যিই কোনও উপহাসের ইনজেক্ট করতে হয় তবে আপনি মডুলার সুযোগটি প্রকাশ করতে আপনার কোড পরিবর্তন করতে পারেন।

// underTest.js
var innerLib = require('./path/to/innerLib');

function underTest() {
    return innerLib.toCrazyCrap();
}

module.exports = underTest;
module.exports.__module = module;

// test.js
function test() {
    var underTest = require("underTest");
    underTest.__module.innerLib = {
        toCrazyCrap: function() { return true; }
    };
    assert.ok(underTest());
}

.__moduleএটি আপনার এপিআই-এ প্রকাশিত হয়ে সতর্কতা অবলম্বন করুন এবং কোনও কোড তাদের নিজস্ব বিপদে মডিউলার স্কোপ অ্যাক্সেস করতে পারে।


2
ধরে নিই যে তৃতীয় পক্ষের কোডটি ভালভাবে পরীক্ষিত হয়েছে আইএমও কাজ করার দুর্দান্ত উপায় নয়।
হেনরি.ওসওয়াল্ড

5
@ ব্যাক এটি কাজ করার দুর্দান্ত উপায়। এটি আপনাকে কেবলমাত্র উচ্চমানের তৃতীয় পক্ষের কোডের সাথে কাজ করতে বা আপনার কোডের সমস্ত টুকরো লিখতে বাধ্য করে যাতে প্রতিটি নির্ভরতা ভালভাবে পরীক্ষা করা হয়
রায়নোস

ঠিক আছে আমি ভেবেছিলাম আপনি আপনার কোড এবং তৃতীয় পক্ষের কোডের মধ্যে ইন্টিগ্রেশন পরীক্ষা না করার বিষয়ে উল্লেখ করছেন। একমত।
henry.oswald

1
একটি "ইউনিট টেস্ট স্যুট" কেবলমাত্র ইউনিট পরীক্ষার সংগ্রহ, তবে ইউনিট পরীক্ষাগুলি একে অপরের থেকে স্বতন্ত্র হওয়া উচিত, সুতরাং ইউনিট পরীক্ষায় ইউনিট। ব্যবহারযোগ্য হওয়ার জন্য, ইউনিট পরীক্ষাগুলি দ্রুত এবং স্বতন্ত্র হতে হবে, যাতে আপনি পরিষ্কারভাবে দেখতে পারেন যে কোনও ইউনিট পরীক্ষায় ব্যর্থ হলে কোডটি কোথায় ভাঙা।
আন্দ্রেয়াস বারহিম ব্রুডিন

এটি আমার পক্ষে কাজ করে না। মডিউল অবজেক্টটি "ভ্যারাল লিন ..." ইত্যাদি প্রকাশ করে না
অ্যানিটক্রিস্ট

1

আপনি উপহাস লাইব্রেরি ব্যবহার করতে পারেন :

describe 'UnderTest', ->
  before ->
    mockery.enable( warnOnUnregistered: false )
    mockery.registerMock('./path/to/innerLib', { doComplexStuff: -> 'Complex result' })
    @underTest = require('./path/to/underTest')

  it 'should compute complex value', ->
    expect(@underTest()).to.eq 'Complex result'

1

কৌতূহলের জন্য মডিউলগুলি মক করার সহজ কোড

আপনি যে অংশগুলিতে হেরফের করছেন সেদিকে লক্ষ্য করুন require.cacheএবং নোট require.resolveপদ্ধতিটি এটি হ'ল গোপন সস।

class MockModules {  
  constructor() {
    this._resolvedPaths = {} 
  }
  add({ path, mock }) {
    const resolvedPath = require.resolve(path)
    this._resolvedPaths[resolvedPath] = true
    require.cache[resolvedPath] = {
      id: resolvedPath,
      file: resolvedPath,
      loaded: true,
      exports: mock
    }
  }
  clear(path) {
    const resolvedPath = require.resolve(path)
    delete this._resolvedPaths[resolvedPath]
    delete require.cache[resolvedPath]
  }
  clearAll() {
    Object.keys(this._resolvedPaths).forEach(resolvedPath =>
      delete require.cache[resolvedPath]
    )
    this._resolvedPaths = {}
  }
}

এর মতো ব্যবহার করুন :

describe('#someModuleUsingTheThing', () => {
  const mockModules = new MockModules()
  beforeAll(() => {
    mockModules.add({
      // use the same require path as you normally would
      path: '../theThing',
      // mock return an object with "theThingMethod"
      mock: {
        theThingMethod: () => true
      }
    })
  })
  afterAll(() => {
    mockModules.clearAll()
  })
  it('should do the thing', async () => {
    const someModuleUsingTheThing = require('./someModuleUsingTheThing')
    expect(someModuleUsingTheThing.theThingMethod()).to.equal(true)
  })
})

তবে ... প্রক্সিওয়্যারটি দুর্দান্ত দুর্দান্ত এবং আপনার এটি ব্যবহার করা উচিত। এটি আপনার প্রয়োজনীয় ওভাররাইডগুলি কেবলমাত্র পরীক্ষার জন্য স্থানীয়করণ করে রাখে এবং আমি এটির সুপারিশ করি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.