javascript मैं जेस्ट का उपयोग करके एक ईएस 6 मॉड्यूल आयात कैसे कर सकता हूं?




node.js mocking (5)

मैं एक हैक का उपयोग कर 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 के मॉड्यूल ऑब्जेक्ट को बदल रहा है, और इसलिए यह अन्य परीक्षणों में 'लीक' होगा। इसलिए यदि आप इस दृष्टिकोण का उपयोग करते हैं तो आपको मूल मूल्य को संग्रहीत करना चाहिए और फिर प्रत्येक परीक्षण के बाद इसे फिर से सेट करना चाहिए। जेस्ट के साथ आसानी से ऐसा करने के लिए, spyOn() बजाय spyOn() विधि का उपयोग करें क्योंकि यह आसानी से अपने मूल मूल्य को बहाल करने का समर्थन करता है, इसलिए पहले उल्लेखित 'लीक' से बचना चाहिए।

मुझे लगता है कि यह संभव नहीं है, लेकिन मैं वैसे भी पूछना चाहता हूं।

मैं यह परीक्षण करना चाहता हूं कि मेरा एक ईएस 6 मॉड्यूल एक विशेष तरीके से दूसरे ईएस 6 मॉड्यूल को कॉल करता है। जैस्मीन के साथ यह सुपर आसान है -

एप्लिकेशन कोड:

// 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 s की require साथ s को प्रतिस्थापित कर रहा हूं, और उन्हें परीक्षणों / कार्यों के अंदर ले जा रहा हूं। न तो ऐसी चीजें हैं जो मैं करना चाहता हूं।

// 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 अंदर फ़ंक्शन एक डिफ़ॉल्ट निर्यात है। हालाँकि, मुझे पता है कि डिफ़ॉल्ट निर्यात पर जासूसी काम नहीं करती है (या कम से कम मैं इसे काम करने के लिए कभी नहीं पा सकता), इसलिए मैं उम्मीद नहीं कर रहा हूं कि यह जेस्ट में भी संभव है।


कीट का उपयोग कर 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);
  });
});

अन्य विकल्पों ने मेरे मामले के लिए काम नहीं किया।


प्रश्न पहले से ही उत्तर दिया गया है लेकिन आप इसे इस तरह हल कर सकते हैं:

dependency.js

module.exports.doSomething = (x) => x

myModule.js:

const { doSomething } = require('./dependency')
module.exports = (x) => doSomething(x * 2)

myModule.spec.js:

jest.mock('../dependency')
const { doSomething } = require('../dependency')
const myModule = require('../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
    });
  });

आपको मॉड्यूल का मज़ाक उड़ाना होगा और अपने आप से जासूस सेट करना होगा:

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);
  });
});

एंड्रियास उत्तर के लिए और अधिक जोड़ना। मुझे ES6 कोड के साथ भी यही समस्या थी लेकिन आयात को म्यूट नहीं करना चाहता था। वह हैकी लग रही थी। इसलिए मैंने ऐसा किया

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

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

और dependency.js के समानांतर "__ mocks __" फ़ोल्डर में निर्भरता जोड़ दिया। इसने मेरे लिए काम किया। इसके अलावा, इसने मुझे नकली कार्यान्वयन से उपयुक्त डेटा वापस करने का विकल्प दिया। सुनिश्चित करें कि आप उस मॉड्यूल का सही मार्ग दें जिसे आप मॉक करना चाहते हैं।





jestjs