প্রতি একক পরীক্ষার ভিত্তিতে মক বাস্তবায়ন কীভাবে পরিবর্তন করবেন [জেস্টজেস]


96

আমি চাই একটি ব্যঙ্গ নির্ভরতা বাস্তবায়ন পরিবর্তন প্রতি একটি উপর একক পরীক্ষা ভিত্তিতে দ্বারা ডিফল্ট উপহাস ব্যাপ্ত এর আচরণ এবং এটি ফিরিয়ে প্রত্যাবর্তন মূল বাস্তবায়ন যখন পরবর্তী পরীক্ষা, executes করতে।

আরও সংক্ষেপে আমি এটি অর্জন করার চেষ্টা করছি:

  1. মোক নির্ভরতা
  2. একক পরীক্ষায় মক প্রয়োগ পরিবর্তন / প্রসারিত করুন
  3. যখন পরের পরীক্ষাটি কার্যকর হয় তখন মূল উপহাসে ফিরে আসুন

আমি বর্তমানে ব্যবহার করছি Jest v21

এখানে একটি জাস্টিক টেস্ট দেখতে কেমন হবে তা এখানে:

__mocks__/myModule.js

const myMockedModule = jest.genMockFromModule('../myModule');

myMockedModule.a = jest.fn(() => true);
myMockedModule.b = jest.fn(() => true);

export default myMockedModule;

__tests__/myTest.js

import myMockedModule from '../myModule';

// Mock myModule
jest.mock('../myModule');

beforeEach(() => {
  jest.clearAllMocks();
});

describe('MyTest', () => {
  it('should test with default mock', () => {
    myMockedModule.a(); // === true
    myMockedModule.b(); // === true
  });

  it('should override myMockedModule.b mock result (and leave the other methods untouched)', () => {
    // Extend change mock
    myMockedModule.a(); // === true
    myMockedModule.b(); // === 'overridden'
    // Restore mock to original implementation with no side effects
  });

  it('should revert back to default myMockedModule mock', () => {
    myMockedModule.a(); // === true
    myMockedModule.b(); // === true
  });
});

আমি এ পর্যন্ত চেষ্টা করেছি এখানে:


1 - mockFn.mockImplementationOnce (fn)

ভাল

  • প্রথম কলের পরে মূল বাস্তবায়নে ফিরে আসে

কনস

  • পরীক্ষাটি bএকাধিকবার কল করলে এটি ভেঙে যায়
  • bডাকা না হওয়া পর্যন্ত এটি মূল প্রয়োগে ফিরে যাবে না (পরের পরীক্ষায় ফাঁস হওয়া )

কোড:

it('should override myModule.b mock result (and leave the other methods untouched)', () => {

  myMockedModule.b.mockImplementationOnce(() => 'overridden');

  myModule.a(); // === true
  myModule.b(); // === 'overridden'
});

2 - jest.doMock (মডিউল নাম, কারখানা, বিকল্পসমূহ)

ভাল

  • স্পষ্টভাবে প্রতিটি পরীক্ষায় পুনরায় বিদ্রূপ করা

কনস

  • সমস্ত পরীক্ষার জন্য ডিফল্ট মক বাস্তবায়ন সংজ্ঞায়িত করা যায় না
  • প্রতিটি উপহাস পদ্ধতি পুনরায় ঘোষণা করতে বাধ্য করার জন্য ডিফল্ট বাস্তবায়ন বাড়ানো যায় না

কোড:

it('should override myModule.b mock result (and leave the other methods untouched)', () => {

  jest.doMock('../myModule', () => {
    return {
      a: jest.fn(() => true,
      b: jest.fn(() => 'overridden',
    }
  });

  myModule.a(); // === true
  myModule.b(); // === 'overridden'
});

3 - সেটার পদ্ধতিগুলির সাথে ম্যানুয়াল উপহাস করা ( এখানে বর্ণিত হিসাবে )

ভাল

  • উপহাসের ফলাফলের উপরে সম্পূর্ণ নিয়ন্ত্রণ

কনস

  • প্রচুর বয়লারপ্লেট কোড
  • দীর্ঘমেয়াদে রক্ষণাবেক্ষণ করা শক্ত

কোড:

__mocks__/myModule.js

const myMockedModule = jest.genMockFromModule('../myModule');

let a = true;
let b = true;

myMockedModule.a = jest.fn(() => a);
myMockedModule.b = jest.fn(() => b);

myMockedModule.__setA = (value) => { a = value };
myMockedModule.__setB = (value) => { b = value };
myMockedModule.__reset = () => {
  a = true;
  b = true;
};
export default myMockedModule;

__tests__/myTest.js

it('should override myModule.b mock result (and leave the other methods untouched)', () => {
  myModule.__setB('overridden');

  myModule.a(); // === true
  myModule.b(); // === 'overridden'

  myModule.__reset();
});

4 - jest.spyOn (বস্তু, পদ্ধতি নাম)

কনস

  • আমি mockImplementationআসল উপহাস করা রিটার্ন মানটিতে ফিরে যেতে পারি না , তাই পরবর্তী পরীক্ষাগুলি প্রভাবিত করে

কোড:

beforeEach(() => {
  jest.clearAllMocks();
  jest.restoreAllMocks();
});

// Mock myModule
jest.mock('../myModule');

it('should override myModule.b mock result (and leave the other methods untouched)', () => {

  const spy = jest.spyOn(myMockedModule, 'b').mockImplementation(() => 'overridden');

  myMockedModule.a(); // === true
  myMockedModule.b(); // === 'overridden'

  // How to get back to original mocked value?
});

ভাল লাগল তবে '@ প্রাইভেট-রেপো / মডিউল' এর মতো এনপিএম মডিউলটির জন্য আপনি বিকল্প 2 কীভাবে করবেন? বেশিরভাগ উদাহরণ যা আমি দেখি তাতে আপেক্ষিক পথ রয়েছে? এটি কি ইনস্টল করা মডিউলগুলির জন্যও কাজ করে?
mrbinky3000

উত্তর:


54

লেখার পরীক্ষার জন্য একটি দুর্দান্ত প্যাটার্ন হ'ল একটি সেটআপ ফ্যাক্টরি ফাংশন তৈরি করা যা বর্তমান মডিউলটি পরীক্ষা করার জন্য আপনার প্রয়োজনীয় ডেটা ফেরত দেয়।

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

const spyReturns = returnValue => jest.fn(() => returnValue);

describe("scenario", () => {
  const setup = (mockOverrides) => {
    const mockedFunctions =  {
      a: spyReturns(true),
      b: spyReturns(true),
      ...mockOverrides
    }
    return {
      mockedModule: jest.doMock('../myModule', () => mockedFunctions)
    }
  }

  it("should return true for module a", () => {
    const { mockedModule } = setup();
    expect(mockedModule.a()).toEqual(true)
  });

  it("should return override for module a", () => {
    const EXPECTED_VALUE = "override"
    const { mockedModule } = setup({ a: spyReturns(EXPECTED_VALUE)});
    expect(mockedModule.a()).toEqual(EXPECTED_VALUE)
  });
});

42

ভ্যানিলা জেএস

MockFn.mockImplementation (fn) ব্যবহার করুন ।

import { funcToMock } from './somewhere';
jest.mock('./somewhere');

beforeEach(() => {
  funcToMock.mockImplementation(() => { /* default implementation */ });
});

test('case that needs a different implementation of funcToMock', () => {
  funcToMock.mockImplementation(() => { /* implementation specific to this test */ });
  // ...
});

টাইপস্ক্রিপ্ট

ভ্যানিলা জেএস সমাধান ছাড়াও:

মক বার্তাটি রোধ করতে ফ্যানক্টোমকের সম্পত্তি নয় , আপনাকে প্রকারটি উল্লেখ করতে হবে, উদাহরণস্বরূপ উপরের লাইনটি নীচের দিকে পরিবর্তন করে:

import { (funcToMock as jest.Mock) } from './somewhere';

এই সমস্যাটিকে সম্বোধন করে একটি প্রশ্ন এখানে পাওয়া যাবে: ঠাট্টা টাইপস্ক্রিপ্ট সম্পত্তি বিদ্রূপ প্রকারে বিদ্যমান নেই


23

পার্টিতে কিছুটা দেরি হলেও অন্য কারও সাথে যদি এ নিয়ে সমস্যা হয়।

আমরা রিস্ক-নেটিভ বিকাশের জন্য টাইপস্ক্রিপ্ট, ES6 এবং ব্যাবেল ব্যবহার করি।

আমরা সাধারণত রুট __mocks__ডিরেক্টরিতে বহিরাগত এনপিএম মডিউলগুলি উপহাস করি ।

আমি একটি নির্দিষ্ট পরীক্ষার জন্য অ্যাউস-এমপ্লিফাইয়ের অ্যাথ ক্লাসের মডিউলটির একটি নির্দিষ্ট ফাংশনটিকে ওভাররাইড করতে চেয়েছিলাম।

    import { Auth } from 'aws-amplify';
    import GetJwtToken from './GetJwtToken';
    ...
    it('When idToken should return "123"', async () => {
      const spy = jest.spyOn(Auth, 'currentSession').mockImplementation(() => ({
        getIdToken: () => ({
          getJwtToken: () => '123',
        }),
      }));

      const result = await GetJwtToken();
      expect(result).toBe('123');
      spy.mockRestore();
    });

সংক্ষিপ্তসার: https://gist.github.com/thomashagstrom/e5bffe6c3e3acec592201b6892226af2

টিউটোরিয়াল: https://medium.com/p/b4ac52a005d#19c5

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