জাস্ট ব্যবহার করে আমি কীভাবে কোনও ES6 মডিউল আমদানি করতে পারি?


281

আমি ভাবতে শুরু করেছিলাম এটি সম্ভব নয় তবে আমি যাই হোক জিজ্ঞাসা করতে চাই।

আমি এটি পরীক্ষা করতে চাই যে আমার একটি ES6 মডিউল অন্য একটি ES6 মডিউলকে একটি বিশেষ উপায়ে কল করে। জুঁইয়ের সাথে এটি অত্যন্ত সহজ -

অ্যাপ্লিকেশন কোড:

// myModule.js
import dependency from './dependency';

export default (x) => {
  dependency.doSomething(x * 2);
}

এবং পরীক্ষার কোড:

//myModule-test.js
import myModule from '../myModule';
import dependency from '../dependency';

describe('myModule', () => {
  it('calls the dependency with double the input', () => {
    spyOn(dependency, 'doSomething');

    myModule(2);

    expect(dependency.doSomething).toHaveBeenCalledWith(4);
  });
});

জাস্টের সমতুল্য কী? আমার মনে হচ্ছে এটি করা খুব সহজ জিনিস, তবে আমি আমার চুলগুলি বের করার চেষ্টা করছিলাম।

নিকটস্থ আমি এসেছ প্রতিস্থাপন করে importদিয়ে গুলি requireগুলি, এবং তাদের পরীক্ষায় / ফাংশন ভিতরে চলন্ত। এর মধ্যে কোনটিই আমি করতে চাই না।

// myModule.js
export default (x) => {
  const dependency = require('./dependency'); // yuck
  dependency.doSomething(x * 2);
}

//myModule-test.js
describe('myModule', () => {
  it('calls the dependency with double the input', () => {
    jest.mock('../dependency');

    myModule(2);

    const dependency = require('../dependency'); // also yuck
    expect(dependency.doSomething).toBeCalledWith(4);
  });
});

বোনাস পয়েন্টগুলির জন্য, যখন ভিতরে ফাংশনটি dependency.jsএকটি ডিফল্ট রফতানি হয় তখন আমি পুরো জিনিসটি কাজ করতে পছন্দ করব । তবে আমি জানি যে ডিফল্ট রফতানিতে গুপ্তচরবৃত্তি জেসমিনে কাজ করে না (বা কমপক্ষে আমি এটি কখনই কাজ করতে পারি না), তাই আমি আশা করি যে জেস্টে এটিও সম্ভব possible


আমি এই প্রকল্পের জন্য হট্টগোল ব্যবহার করছি যাহাই হউক না কেন, তাই আমি অব্যাহত transpile করার কিছু মনে না করেন imports করা requireএখন জন্য গুলি। যদিও মাথা আপ জন্য ধন্যবাদ।
ক্যাম জ্যাকসন

আমার যদি টিএস ক্লাস এ থাকে এবং এটি কোনও ফাংশনকে কল করে তবে আমরা ক্লাস বি এর ডসোমিংথিং () বলতে পারি যাতে আমরা কীভাবে উপহাস করতে পারি যাতে ক্লাস এ ক্লাস বি ফাংশনের ডকুমেন্ট সংস্করণে কল করতে পারে ডুমসিং ()
কৈলাশ যোগেশ্বর

যারা এই সমস্যাটি আরও জানতে
ওমরাল্পার

উত্তর:


219

আমি জড়িত একটি হ্যাক ব্যবহার করে এটি সমাধান করতে সক্ষম হয়েছি import *। এমনকি এটি নামযুক্ত এবং ডিফল্ট উভয়ই রফতানির জন্য কাজ করে!

নামযুক্ত রফতানির জন্য:

// dependency.js
export const doSomething = (y) => console.log(y)

// myModule.js
import { doSomething } from './dependency';

export default (x) => {
  doSomething(x * 2);
}

// myModule-test.js
import myModule from '../myModule';
import * as dependency from '../dependency';

describe('myModule', () => {
  it('calls the dependency with double the input', () => {
    dependency.doSomething = jest.fn(); // Mutate the named export

    myModule(2);

    expect(dependency.doSomething).toBeCalledWith(4);
  });
});

বা একটি ডিফল্ট রফতানি জন্য:

// dependency.js
export default (y) => console.log(y)

// myModule.js
import dependency from './dependency'; // Note lack of curlies

export default (x) => {
  dependency(x * 2);
}

// myModule-test.js
import myModule from '../myModule';
import * as dependency from '../dependency';

describe('myModule', () => {
  it('calls the dependency with double the input', () => {
    dependency.default = jest.fn(); // Mutate the default export

    myModule(2);

    expect(dependency.default).toBeCalledWith(4); // Assert against the default
  });
});

মিহাই দামিয়ান যেমন ঠিক নীচে নির্দেশ করেছেন, এটি মডিউল অবজেক্টটিকে রূপান্তর করছে dependencyএবং তাই এটি অন্যান্য পরীক্ষাগুলিতে 'ফাঁস' হবে। সুতরাং আপনি যদি এই পদ্ধতির ব্যবহার করেন তবে আপনার মূল মানটি সংরক্ষণ করা উচিত এবং প্রতিটি পরীক্ষার পরে এটি আবার সেট করা উচিত। জাস্টের সাহায্যে এটি সহজেই করা যায়, পরিবর্তে স্পাইঅন () পদ্ধতিটি ব্যবহার করুন jest.fn()কারণ এটি সহজেই তার মূল মানটি পুনরুদ্ধার করতে সহায়তা করে, তাই উল্লেখ করা 'ফাঁস' হওয়ার আগে এড়ানো উচিত।


ভাগ করে নেওয়ার জন্য ধন্যবাদ. আমি মনে করি নেট ফলাফলের এই অনুরূপ - কিন্তু এই ক্লিনার হতে পারে - stackoverflow.com/a/38414160/1882064
arcseldon

64
এটি কার্যকর, তবে এটি সম্ভবত একটি ভাল অনুশীলন নয়। পরীক্ষার ক্ষেত্রের বাইরে অবজেক্টে পরিবর্তনগুলি টেস্টের মধ্যে অবিচ্ছিন্ন বলে মনে হয়। এটি পরবর্তীতে অন্যান্য পরীক্ষায় অপ্রত্যাশিত ফলাফলের দিকে নিয়ে যেতে পারে।
মিহাই দামিয়ান

10
Jest.fn () ব্যবহার করার পরিবর্তে, আপনি jest.spyOn () ব্যবহার করতে পারেন যাতে আপনি মূল পদ্ধতিটি পরে পুনরুদ্ধার করতে পারেন, যাতে এটি অন্যান্য পরীক্ষায় রক্তপাত না করে। : আমি বিভিন্ন পন্থা এখানে (jest.fn, jest.mock এবং jest.spyOn) সম্পর্কে চমৎকার নিবন্ধ পাওয়া medium.com/@rickhanlonii/understanding-jest-mocks-f0046c68e53c
মার্টিনসোস 13

2
কেবলমাত্র একটি দ্রষ্টব্য: যদি dependencyএকই ফাইলটিতে থাকে তবে myModuleএটি কাজ করবে না।
লু ট্রান

2
আমি মনে করি এটি টাইপস্ক্রিপ্টের সাথে কাজ করবে না আপনি যে জিনিসটি পরিবর্তন করছেন তা কেবল পঠনযোগ্য।
অ্যাড্রেডেক্স

171

আপনাকে মডিউলটিকে উপহাস করতে হবে এবং নিজেই গুপ্তচর সেট করতে হবে:

import myModule from '../myModule';
import dependency from '../dependency';
jest.mock('../dependency', () => ({
  doSomething: jest.fn()
}))

describe('myModule', () => {
  it('calls the dependency with double the input', () => {
    myModule(2);
    expect(dependency.doSomething).toBeCalledWith(4);
  });
});

4
এটা ঠিক মনে হচ্ছে না। আমি পেয়েছি: babel-plugin-jest-hoist: The second argument of jest.mock must be a function.সুতরাং কোডটিও সংকলন করছে না।
ক্যাম জ্যাকসন

3
দুঃখিত, আমি আমার কোড আপডেট করেছি। দয়া করে মনে রাখবেন যে পথটি jest.mockপরীক্ষার ফাইলের সাথে সম্পর্কিত।
Andreas Köberle

1
এটি আমার পক্ষে কাজ করেছিল, তবে ডিফল্ট রফতানি ব্যবহার করার সময় নয়।
আইরিস শ্যাফার

4
ডিফল্ট রফতানির সাথে এই কাজটি করার জন্য @ আইরিস শ্যাফার আপনাকে __esModule: trueমক অবজেক্টে যুক্ত করতে হবে। এটি ট্রান্সপ্লাইড এস 6 মডিউল বা কমনজ মডিউল কিনা তা নির্ধারণের জন্য পরিচ্ছন্ন কোড দ্বারা অভ্যন্তরীণ পতাকা এটি ব্যবহৃত হয়।
জোহানেস লম্প্প

24
jest.mock('../dependency', () => ({ default: jest.fn() }))
মজাদার

50

ঠাট্টা ব্যবহার করে কোনও ES6 নির্ভরতা মডিউল ডিফল্ট রফতানি উপহাস করতে:

import myModule from '../myModule';
import dependency from '../dependency';

jest.mock('../dependency');

// If necessary, you can place a mock implementation like this:
dependency.mockImplementation(() => 42);

describe('myModule', () => {
  it('calls the dependency once with double the input', () => {
    myModule(2);

    expect(dependency).toHaveBeenCalledTimes(1);
    expect(dependency).toHaveBeenCalledWith(4);
  });
});

অন্যান্য বিকল্পগুলি আমার ক্ষেত্রে কার্যকর হয়নি।


6
আমি যদি কেবল একটি পরীক্ষা করতে চাই তবে এটি পরিষ্কার করার সর্বোত্তম উপায় কী? ভিতরে পরে? ach `` `afterEach (() => est jest.unmock (../ depend dependance ');})` `` `
nxmohamad

1
@ ফালসারেল্লা কি ডমক আসলে সেই ক্ষেত্রে কাজ করে? আমার খুব অনুরূপ সমস্যা হচ্ছে এবং আমি যখন নির্দিষ্ট টেস্টের ভিতরে jest.doMock করার চেষ্টা করছি তখন কিছুই হয় না, যেখানে পুরো মডিউলটির জন্য jest.mock সঠিকভাবে কাজ করছে
প্রগ্রেস 1

1
@ প্রগ্রেস 1 আপনি jock.mock ব্যবহার করে মকআইপ্লিমেন্টেশনও আবার চেষ্টা করতে পারেন
falsarella

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

1
@ প্রগ্রেস 1 ম হুম আমি প্রতিটি নির্দিষ্ট পরীক্ষার মধ্যে মক প্রয়োগটি একবারে বোঝাতে চাইছিলাম ... যাইহোক, আমি খুশি হয়েছি আপনি একটি সমাধান খুঁজে পেয়েছেন :)
falsarella

38

Andreas উত্তরে আরও যোগ করা। ES6 কোড নিয়ে আমার একই সমস্যা ছিল তবে আমি আমদানিগুলিকে রূপান্তর করতে চাইনি। হ্যাক লাগছিল। তাই আমি এটি করেছি

import myModule from '../myModule';
import dependency from '../dependency';
jest.mock('../dependency');

describe('myModule', () => {
  it('calls the dependency with double the input', () => {
    myModule(2);
  });
});

এবং "__ উপহাস __" ফোল্ডারে depend depend.js এর সমান্তরালে যুক্ত dependence.js যুক্ত করেছে। এটি আমার পক্ষে কাজ করেছে। এছাড়াও, এটি আমাকে মক বাস্তবায়ন থেকে উপযুক্ত ডেটা ফেরত দেওয়ার বিকল্প দিয়েছে। আপনি যে মডিউলটিকে উপহাস করতে চান তার সঠিক পথটি নিশ্চিত করেছেন তা নিশ্চিত করুন।


এর জন্য ধন্যবাদ. একবার চেষ্টা করে দেখব. খুব এই সমাধান পছন্দ করেছি - stackoverflow.com/a/38414160/1882064
arcseldon

এই পদ্ধতির বিষয়ে আমি যা পছন্দ করি তা হ'ল এটি আপনাকে নির্দিষ্ট মডিউলটি উপহাস করতে চান এমন সমস্ত অনুষ্ঠানের জন্য একটি ম্যানুয়াল মক সরবরাহ করার সম্ভাবনা দেয়। উদাহরণস্বরূপ, আমার কাছে অনুবাদ সহায়ক রয়েছে, যা অনেক জায়গায় ব্যবহৃত হয়। __mocks__/translations.jsফাইল কেবল রপ্তানির ডিফল্ট jest.fn()মত কিছু:export default jest.fn((id) => id)
আইরিস Schaffer

আপনি jest.genMockFromModuleমডিউলগুলি থেকে মক জেনারেট করতেও ব্যবহার করতে পারেন । ফেসবুক.
github.io/jest/docs/…

2
একটি বিষয় লক্ষণীয় যে ES6 মডিউলগুলির মাধ্যমে উপহাস করা হয়েছে export default jest.genMockFromModule('../dependency')তাদের সমস্ত ফাংশন dependency.default`jest.mock ('.. নির্ভরতা') কল করার পরে নির্ধারিত হবে , তবে অন্যথায় প্রত্যাশা অনুযায়ী আচরণ করবে।
jhk

7
আপনার পরীক্ষার দাবীটি কেমন দেখাচ্ছে? এটি উত্তরের একটি গুরুত্বপূর্ণ অংশ বলে মনে হচ্ছে। expect(???)
পাথর

14

2020 এ দ্রুত ফরোয়ার্ড করা, আমি এই লিঙ্কটি সমাধান হতে পেয়েছি। কেবলমাত্র ES6 মডিউল সিনট্যাক্স ব্যবহার করে https://remarkablemark.org/blog/2018/06/28/jest-mock-default-name-export/

// esModule.js
export default 'defaultExport';
export const namedExport = () => {};

// esModule.test.js
jest.mock('./esModule', () => ({
  __esModule: true, // this property makes it work
  default: 'mockedDefaultExport',
  namedExport: jest.fn(),
}));

import defaultExport, { namedExport } from './esModule';
defaultExport; // 'mockedDefaultExport'
namedExport; // mock function

এছাড়াও আপনার একটি জিনিস জানতে হবে (যা বুঝতে পেরে আমাকে কিছুটা সময় নিয়েছিল) তা হ'ল আপনি পরীক্ষার অভ্যন্তরে jest.mock () কল করতে পারবেন না; আপনাকে অবশ্যই এটি মডিউলের শীর্ষ স্তরে কল করতে হবে। তবে আপনি যদি বিভিন্ন পরীক্ষার জন্য বিভিন্ন মক সেটআপ করতে চান তবে আপনি পৃথক পরীক্ষার অভ্যন্তরে মকআইপ্লিমেন্টেশন () কল করতে পারেন।


5

প্রশ্নের ইতিমধ্যে উত্তর দেওয়া হয়েছে তবে আপনি এটির মতো সমাধান করতে পারেন:

dependency.js

const doSomething = (x) => x
export default doSomething;

myModule.js:

import doSomething from "./dependency";

export default (x) => doSomething(x * 2);

myModule.spec.js:

jest.mock('../dependency');
import doSomething from "../dependency";
import myModule from "../myModule";

describe('myModule', () => {
  it('calls the dependency with double the input', () => {
    doSomething.mockImplementation((x) => x * 10)

    myModule(2);

    expect(doSomething).toHaveBeenCalledWith(4);
    console.log(myModule(2)) // 40
  });
});

তবে "প্রয়োজনীয়" হ'ল কমনজেএস বাক্য গঠন - ওপি ইএস 6 মডিউল সম্পর্কে জিজ্ঞাসা করছিল
অ্যান্ডি

@ এবং আপনার মন্তব্যের জন্য ধন্যবাদ, আমি আমার উত্তর আপডেট করেছি। যুক্তিতে বিটিডব্লিউ একই জিনিস।
স্লিম

2

আমি এটি অন্যভাবে সমাধান করেছি। ধরা যাক আপনার আপনার নির্ভরতা.জেএস আছে

export const myFunction = () => { }

আমি নীচের বিষয়বস্তু সহ এটি ছাড়া একটি depdency.mock.js ফাইল তৈরি করি:

export const mockFunction = jest.fn();

jest.mock('dependency.js', () => ({ myFunction: mockFunction }));

এবং পরীক্ষায়, আমি যে ফাইলটি ব্যবহার করি তার অবনতিযুক্ত ফাইলটি আমদানি করার আগে:

import { mockFunction } from 'dependency.mock'
import functionThatCallsDep from './tested-code'

it('my test', () => {
    mockFunction.returnValue(false);

    functionThatCallsDep();

    expect(mockFunction).toHaveBeenCalled();

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