2015-02-14 11 views
12

मैं जेस्ट में एक वस्तु उपहास करने के लिए (जो मेरे द्वारा बनाए गए) तो मैं प्रतिक्रिया घटक (ताकि वास्तविक कार्यान्वयन नहीं किया जाता है)जेस्ट में मैन्युअल रूप से अपनी फ़ाइलों में से एक को कैसे नकल करते हैं?

यह मेरा घटक ChatApp प्रतिक्रिया है के भीतर डिफ़ॉल्ट व्यवहार प्रदान कर सकते हैं कोशिश कर रहा हूँ (यह बहुत है सीधे आगे)

'use strict'; 
var React, ChatApp, ChatPanel, i18n; 

React = require('react'); 
ChatPanel = require('./chat_panel'); 
i18n = require('../support/i18n'); 

ChatApp = React.createClass({ 
    render() { 
    return (
     <div className="chat-app"> 
     <h1>{i18n.t("app.title")}</h1> 
     <ChatPanel /> 
     </div> 
    ); 
    } 
}); 

module.exports = ChatApp; 

तो मैं एक कस्टम I18n निर्भरता कि अनुवाद करता है (i18n कुछ मैं लिखा है कि नोड बहुभाषी के लिए एक आवरण) है।

तो मैं यह देखने के लिए एक बुनियादी परीक्षण करना चाहता हूं कि एच 1 में सही शब्द है या नहीं, लेकिन मैं अपने I18n ऑब्जेक्ट पर jest.dontMock() सेट नहीं करना चाहता, क्योंकि मैं इसे नहीं चाहता ChatApp परीक्षण में वास्तविक वस्तु का उपयोग करें।

तो हंसी वेबसाइट पर बुनियादी निर्देशों का पालन, मैं बनाया एक फ़ोल्डर मजाक उड़ाता है और जो मूल वस्तु से एक नकली उत्पन्न करता है और उसके बाद टी विधि ओवरराइड करता है और मुझे अनुमति देने के लिए एक विधि कहते हैं i18n के लिए एक नकली फ़ाइल, बनाया टी के लिए रिटर्न स्ट्रिंग सेट करने के लिए।

'use strict'; 
var React, ChatApp, TestUtils, path; 

path = '../../../scripts/components/'; 
jest.dontMock(path + 'chat_app'); 

React = require('react/addons'); 
ChatApp = require(path + 'chat_app'); 
TestUtils = React.addons.TestUtils; 

describe('ChatApp',() => { 
    beforeEach(() => { 
    require('i18n').__setReturnString('Chat App'); 
    }); 

    var ChatAppElement = TestUtils.renderIntoDocument(<ChatApp />); 

    it('renders a title on the page',() => { 
    var title = TestUtils.findRenderedDOMComponentWithTag(ChatAppElement, 'h1'); 
    expect(title.tagName).toEqual('H1'); 
    expect(title.props.children).toEqual('Chat App'); 
    }); 
}); 

तो मैं भीतर i18n वस्तु console.log:

यह नकली वस्तु

'use strict'; 
var i18nMock, _returnString; 

i18nMock = jest.genMockFromModule('../scripts/support/i18n'); 

_returnString = ""; 

function __setReturnString(string) { 
    _returnString = string; 
} 

function t(key, options = null) { 
    return _returnString; 
} 

i18nMock.t.mockImplementation(t); 
i18nMock.__setReturnString = __setReturnString; 

module.exports = i18nMock; 

अब मेरी ChatApp परीक्षण में मैं प्रत्येक से पहले एक में नकली की आवश्यकता होती है, इसलिए की तरह है परीक्षण करें तो मुझे सही मॉक ऑब्जेक्ट मिलता है, __setReturnString भी ट्रिगर हो जाता है (जैसे कि मैं उस संदेश में console.log को लॉग देखता हूं)।

हालांकि, अगर मैं वास्तविक प्रतिक्रिया घटक के भीतर i18n ऑब्जेक्ट को console.log करता हूं तो यह एक जेस्ट मॉक प्राप्त करता है लेकिन इसे मेरा जेस्ट मॉक नहीं मिलता है, इसलिए टी विधि एक खाली विधि है जो कुछ भी नहीं करती है, मतलब परीक्षण विफल रहता है।

कोई विचार क्या मैं गलत कर रहा हूं?

धन्यवाद एक बहुत

उत्तर

1

जेस्ट स्वचालित मजाक करता है। बस i18n = require('../support/i18n') पर्याप्त होना चाहिए। यही कारण है कि आपको आमतौर पर पहले स्थान पर jest.dontMock पर कॉल करना होगा। https://facebook.github.io/jest/docs/automatic-mocking.html

+0

हाय, इनपुट के लिए धन्यवाद। हालांकि, मैं नहीं चाहता कि जेस्ट एक स्वचालित नकली प्रदान करे क्योंकि जेस्ट स्वचालित नकली कार्य कुछ भी वापस नहीं करते हैं। जो मेरा परीक्षण विफल कर देगा क्योंकि यह एक स्ट्रिंग का अनुवाद और लौटने की उम्मीद कर रहा है। जेस्ट डॉक्स पर मैन्युअल मॉकिंग मुझे चाहिए जो मुझे चाहिए क्योंकि मैं अपनी ऑब्जेक्ट का एक मॉक संस्करण चाहता हूं जो कि मैं इसे बताता हूं। – TheStoneFox

+0

स्वचालित मॉकिंग के साथ चिपकने और परीक्षण में नकली को कॉन्फ़िगर करने का प्रयास करने के बारे में कैसे? कुछ 'var i18n = आवश्यकता है (' i18n '); i18n.t.mockReturnValue ('मेरी वापसी स्ट्रिंग') – kraf

+2

हाय, मैंने चीज़ की आवश्यकता और मूल्य को मजाक करने की कोशिश की, लेकिन वास्तविक कार्यान्वयन (ChatApp के अंदर) जब टी कहा जाता है, यह अभी भी अपरिभाषित लौट रहा है, इसलिए नकली नहीं है काम कर रहे। परीक्षण में i18n ऑब्जेक्ट सही ढंग से मजाक किया गया है लेकिन यह iAppn ऑब्जेक्ट ChatApp कोड में उपयोग नहीं किया गया है। – TheStoneFox

5

मैं मुसीबत के रूप में अच्छी तरह से काम कर रहा __mocks__ फ़ोल्डर हो रही लिया है:

आप यहाँ अधिक जानकारी प्राप्त कर सकते हैं। जिस तरह से मैं इसके आसपास आया वह jest.setMock(); विधि का उपयोग कर रहा है।

आपके मामले में, आप jest.setMock('../../../scripts/i18n/', require('../__mocks__/i18n');

जाहिर है, मैं नहीं अपने नकली के स्थान और वास्तविक पुस्तकालय आप उपयोग कर रहे के स्थान के कुछ कर रहा हूँ होगा, लेकिन पहले पैरामीटर जहां अपने वास्तविक पथ का उपयोग करना चाहिए मॉड्यूल संग्रहीत किया जाता है और दूसरे को पथ का उपयोग करना चाहिए जहां आपका नकली संग्रहीत है।

यह आपके मॉड्यूल और आपके मॉड्यूल को मैन्युअल रूप से मॉक किए गए i18n मॉड्यूल का उपयोग करने के लिए आवश्यक सभी मॉड्यूल (प्रतिक्रिया सहित) को मजबूर करना चाहिए।

0

क्या mattykuzykhis answer में उल्लेख है मेरे लिए बिल्कुल काम नहीं किया है :(

हालांकि, क्या मुझे पता चला समस्या मेरे लिए हंसी का सेटअप था लग रहा था: मैं शुरुआत में moduleNameMapper इस्तेमाल किया, और के लिए अगर किसी कारण इन कभी नहीं मज़ाक उड़ाया जाता है ...

मेरे लिए पहला कदम

तो बजाय moduleDirectories करने के लिए अपने मॉड्यूल का नाम मैप किया फ़ोल्डर को ले जाना काम करने के लिए कुछ भी पाने के लिए किया गया था।

कि बाद, मैं बस एक __mocks__ जोड़ सकता है वास्तविक के निकट फ़ाइल कार्यान्वयन (मेरे मामले में utils/translation.js और utils/__mocks__/translation.js)। मेरे translations.js डिफ़ॉल्ट अनुवाद एक अनुवाद समारोह के रूप में, मैं भी डिफ़ॉल्ट रूप से मेरे नकली निर्यात किया। पूरे __mocks__/translations.js बस सुपर है और इस प्रकार है:

export default jest.fn((key, unwrap = false) => (
 
    unwrap && `${key}-unwrapped` || `${key}-wrapped` 
 
))

हालांकि मैं यह परीक्षण नहीं किया, जोड़ने एक __setReturnString, काफी आसान होना चाहिए मेरे लिए यह पर्याप्त था करने के लिए वास्तव में मेरे अनुवाद वापसी कुंजी। उम्मीद है की यह मदद करेगा!

संबंधित मुद्दे