दिलचस्प पोस्ट
उत्पादन में जावा जी 1 कचरा संग्रहण पौराणिक कथा के साथ मटप्ललिब स्कैटरप्लॉट उपयोगकर्ता द्वारा प्रवेश की गई पंक्ति को किसी टेक्स्टएरिया से डेटाबेस में कैसे बचाया जाता है? स्थानीय .aar फ़ाइलों को "फ्लैटडिआईर्स" का उपयोग करके ग्रैडल बिल्डिंग में जोड़ना काम नहीं कर रहा है क्लॉज विकल्प में तैयार किए गए स्टेटमेंट? सी ++ का समर्थन कार्यों को वापस नहीं करता है? MySQL त्रुटि: # 1142 – चयन कमांड उपयोगकर्ता को अस्वीकार कर दिया क्यों उनके कंटेनर से बचने के फ्लोटिंग तत्वों को अतिप्रवाह छुपा दिया जाता है? .NET अपवाद कितना धीमा है? किसी दिए गए समयक्षेत्र के लिए मैं "मध्यरात्रि" का यूटीसी समय कैसे प्राप्त करूं? ddply त्रुटि का अर्थ: 'नाम' विशेषता वेक्टर के समान लंबाई होना चाहिए पटरियों: स्कीनी नियंत्रक बनाम फैट मॉडल, या मैं अपने नियंत्रक Anorexic करना चाहिए? पीएचपी के साथ फ़ाइल में रेखा अधिलेखित करें PHP $ _GET लिनक्स कमांड प्रॉम्प्ट में पास कर रहा है NSDictionary ऑब्जेक्ट के एक NSArray सॉर्ट करने का सबसे अच्छा तरीका?

जाओ में नकली कार्य

मैं एक छोटे निजी परियोजना को कोडिंग करके सीख रहा हूं। हालांकि यह छोटा है, मैंने शुरू से ही सही चलने की अच्छी आदत जानने के लिए कठोर इकाई परीक्षण करने का निर्णय लिया

तुच्छ इकाई परीक्षण सभी ठीक और बांका थे, लेकिन अब मैं निर्भरता के साथ हैरान हूँ; मैं नकली लोगों के साथ कुछ समारोह कॉल को बदलने में सक्षम होना चाहता हूँ मेरे कोड का एक स्निपेट यहां दिया गया है:

func get_page(url string) string { get_dl_slot(url) defer free_dl_slot(url) resp, err := http.Get(url) if err != nil { return "" } defer resp.Body.Close() contents, err := ioutil.ReadAll(resp.Body) if err != nil { return "" } return string(contents) } func downloader() { dl_slots = make(chan bool, DL_SLOT_AMOUNT) // Init the download slot semaphore content := get_page(BASE_URL) links_regexp := regexp.MustCompile(LIST_LINK_REGEXP) matches := links_regexp.FindAllStringSubmatch(content, -1) for _, match := range matches{ go serie_dl(match[1], match[2]) } } 

मैं वास्तव में HTTP के माध्यम से एक पृष्ठ प्राप्त किए बिना डाउनलोडर () को जांचने में सक्षम होना चाहता हूं – या तो मिलती है या तो मिलती है (यानी यह पृष्ठ की सामग्री को स्ट्रिंग के रूप में आसान बनाता है) या http.Get ()।

मुझे यह धागा मिला: https://groups.google.com/forum/#!topic/golang-nuts/6AN1E2CJOxI जो समान समस्या के बारे में लगता है। जूलियन फिलिप्स एक समाधान के रूप में अपनी लाइब्रेरी, विथमॉक ( http://github.com/qur/withmock ) प्रस्तुत करता है, लेकिन मैं इसे काम करने में असमर्थ हूं यहां मेरे परीक्षण कोड के प्रासंगिक हिस्से हैं, जो बड़े पैमाने पर मालवाहक पंथ कोड हैं, ईमानदार होने के लिए:

 import ( "testing" "net/http" // mock "code.google.com/p/gomock" ) ... func TestDownloader (t *testing.T) { ctrl := gomock.NewController() defer ctrl.Finish() http.MOCK().SetController(ctrl) http.EXPECT().Get(BASE_URL) downloader() // The rest to be written } 

परीक्षण उत्पादन निम्नलिखित है:

 ERROR: Failed to install '_et/http': exit status 1 output: can't load package: package _et/http: found packages http (chunked.go) and main (main_mock.go) in /var/folders/z9/ql_yn5h550s6shtb9c5sggj40000gn/T/withmock570825607/path/src/_et/http 

क्या मेरे परीक्षण की समस्या का समाधान एक साथ है? इसे काम करने के लिए मुझे क्या करना चाहिए?

Solutions Collecting From Web of "जाओ में नकली कार्य"

अच्छे परीक्षण के अभ्यास के लिए आप की यश! 🙂

निजी तौर पर, मैं gomock उपयोग नहीं gomock (या उस बात के लिए कोई मजाकिया ढांचे, गो में मजाकिया बिना बहुत आसान है)। मैं या तो एक पैरामीटर के रूप में downloader() फ़ंक्शन पर निर्भरता उत्तीर्ण करूंगा, या मैं एक प्रकार पर downloader() एक विधि get_page , और प्रकार get_page निर्भरता को पकड़ सकता है:

विधि 1: get_page() को downloader() पैरामीटर के रूप में पास करें downloader()

 type PageGetter func(url string) string func downloader(pageGetterFunc PageGetter) { // ... content := pageGetterFunc(BASE_URL) // ... } 

मुख्य:

 func get_page(url string) string { /* ... */ } func main() { downloader(get_page) } 

परीक्षा:

 func mock_get_page(url string) string { // mock your 'get_page()' function here } func TestDownloader(t *testing.T) { downloader(mock_get_page) } 

विधि 2: download() करें download() एक प्रकार की Downloader की विधि:

यदि आप निर्भरता को पैरामीटर के रूप में नहीं देना चाहते हैं, तो आप get_page() एक प्रकार का सदस्य भी बना सकते हैं, और उस प्रकार की एक विधि download() कर download() , जो कि get_page उपयोग कर सकते हैं:

 type PageGetter func(url string) string type Downloader struct { get_page PageGetter } func NewDownloader(pg PageGetter) *Downloader { return &Downloader{get_page: pg} } func (d *Downloader) download() { //... content := d.get_page(BASE_URL) //... } 

मुख्य:

 func get_page(url string) string { /* ... */ } func main() { d := NewDownloader(get_page) d.download() } 

परीक्षा:

 func mock_get_page(url string) string { // mock your 'get_page()' function here } func TestDownloader() { d := NewDownloader(mock_get_page) d.download() } 

मैं ऐसा कुछ करूँगा,

मुख्य

 var getPage = get_page func get_page (... func downloader() { dl_slots = make(chan bool, DL_SLOT_AMOUNT) // Init the download slot semaphore content := getPage(BASE_URL) links_regexp := regexp.MustCompile(LIST_LINK_REGEXP) matches := links_regexp.FindAllStringSubmatch(content, -1) for _, match := range matches{ go serie_dl(match[1], match[2]) } } 

परीक्षा

 func TestDownloader (t *testing.T) { origGetPage := getPage getPage = mock_get_page defer func() {getPage = origGatePage}() // The rest to be written } // define mock_get_page and rest of the codes func mock_get_page (.... 

और मैं गोलांग में _ से बचना चाहूंगा बेहतर उपयोग करें camelcase

यदि आप इसके बजाय एक चर का उपयोग करने के लिए अपनी फ़ंक्शन परिभाषा बदलते हैं:

 var get_page = func(url string) string { ... } 

आप इसे अपने परीक्षणों में ओवरराइड कर सकते हैं:

 func TestDownloader(t *testing.T) { get_page = func(url string) string { if url != "expected" { t.Fatal("good message") } return "something" } downloader() } 

यद्यपि सावधानीपूर्वक, यदि आप उस फ़ंक्शन की कार्यक्षमता का परीक्षण करते हैं जो आप ओवरराइड करते हैं, तो आपके अन्य परीक्षण विफल हो सकते हैं!

गो लेखकों ने इस मानक को मानक लाइब्रेरी में उपयोग करते हैं ताकि परीक्षाओं को परीक्षण में आसान बनाने के लिए कोड में परीक्षण हुक सम्मिलित किया जा सके:

https://golang.org/src/net/hook.go

https://golang.org/src/net/dial.go#L248

https://golang.org/src/net/dial_test.go#L701