2012-08-14 8 views
5

के लिए साइनऑन स्टब मैं एक साधारण फ़ंक्शन का परीक्षण करने की कोशिश कर रहा हूं जो window.location.search पर कॉल करता है। मैं यह समझने की कोशिश कर रहा हूं कि इस कॉल को कैसे दबाया जाए ताकि मैं अपने चयन का यूआरएल वापस कर सकूं।window.location.search

समारोह:

getParameterByName: (name) =>  
    name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]") 
    regexS = "[\\?&]" + name + "=([^&#]*)" 
    regex = new RegExp(regexS)  
    results = regex.exec(window.location.search) //Stub call to window.location.search 
    if(results == null) 
    return "" 
    else 
    return decodeURIComponent(results[1].replace(/\+/g, " ")) 

टेस्ट मामला:

describe "Data tests",() -> 
    it "Should parse parameter from url",() ->   
    data = new Data() 

    console.log("search string: " + window.location.search) //prints "search string:" 
    window.location.search = "myUrl" 
    console.log("search string: " + window.location.search) //prints "search string:" 
    console.log(data.getParameterByName('varName')) 

    expect(true).toBe(true) 

मेरी मूल प्रयास तो जैसे सीधे एक मूल्य के वापस जाने के लिए किया गया था:

sinon.stub(window.location.search).returns("myUrl") 

यह, ज़ाहिर है, नहीं है काम। मुझे नहीं लगता कि मैं सही ढंग से स्टब निर्दिष्ट कर रहा हूं, लेकिन यह मेरा इरादा दिखाता है।

इस पर हल करने के तरीके पर कोई भी विचार बहुत सराहना की जाएगी।

उत्तर

6

तो, जैसा कि पहले उल्लेख, तुम नहीं नकली विंडो स्थान सीधे कर सकते हैं। Mylib.search wrapper विचार मेरी स्थिति के साथ काम नहीं किया। तो, मैंने जो किया वह window.location.search पर अपने स्वयं के कार्य में मेरी कॉल को तोड़ दिया गया था।

getParameterByName: (name) => 
    console.log("name: #{name}") 
    name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]") 
    regexS = "[\\?&]" + name + "=([^&#]*)" 
    regex = new RegExp(regexS) 
    results = regex.exec(@getWindowLocationSearch()) 
    if(results == null) 
    return "" 
    else 
    return decodeURIComponent(results[1].replace(/\+/g, " ")) 

getWindowLocationSearch:() => 
    window.location.search 

फिर अपने परीक्षण मामले में, मैं समारोह अपने परीक्षण कोड के साथ ऐसा तरह की जगह:

describe "Data tests",() -> 
    it "Should parse parameter from localhost url",() -> 
    goodUrl = "http://localhost:3333/?token=val1" 

    Data::getWindowLocationSearch =() -> return goodUrl 
    unit = new Data() 
    result = unit.getParameterByName("token") 

    expect(result).toBe("val1") 

जो लोग Coffeescript, बराबर जावास्क्रिप्ट नहीं पढ़ते के लिए मेरे नए वर्ग इतना की तरह दिखता है कोड नीचे सूचीबद्ध है:

it("Should parse parameter from localhost url", function() { 
    var goodUrl, result, unit; 
    goodUrl = "http://localhost:3333/?token=val1"; 
    Data.prototype.getWindowLocationSearch = function() { 
    return goodUrl; 
    }; 
    unit = new Data(); 
    result = unit.getParameterByName("token"); 
    expect(result).toBe("val1"); 
    return expect(true).toBe(true); 
}); 

जावास्क्रिप्ट के साथ मेरा सामान्य अनुभव है। काम करने का समाधान वहां पहुंचने की यात्रा के रूप में लगभग दर्दनाक नहीं था। आपकी टिप्पणियों और योगदानों के लिए बहुत बहुत धन्यवाद।

2

अद्यतन: window.location, ऐसा लगता है, एक विशेष मामला का एक सा है, इस चर्चा को देखें: https://groups.google.com/forum/?fromgroups#!topic/sinonjs/MMYrwKIZNUU%5B1-25%5D

इस समस्या को हल करने के लिए सबसे आसान तरीका है एक आवरण समारोह के आसपास window.location लिखने के लिए है, और ठूंठ कि:

mylib.search = function (url) { 
    window.location.search = url; 
}; 

और अपने परीक्षण में:

sinon.stub(mylib, 'search').returns("myUrl") 

मूल जवाब:

इस प्रयास करें:

sinon.stub(window.location, 'search').returns("myUrl") 
+1

मैंने इसे पहले कोशिश की है और मैंने इसे फिर से कोशिश की है: 'TypeError: स्ट्रिंग प्रॉपर्टी सर्च को फ़ंक्शन के रूप में लपेटने का प्रयास किया गया है' –

+0

ओह क्षमा करें, 'window.location.search' एक स्ट्रिंग फ़ंक्शन नहीं है, इसलिए आप कर सकते हैं इसे रोक नहीं है। स्टब को असाइनमेंट के साथ बदलें: 'window.location.search = "myUrl" '। –

+0

अजीब, एक कंसोल.लॉग को रिक्त स्ट्रिंग में परिणामों के पहले और बाद में निष्पादित करना, इसलिए मुझे यकीन नहीं है कि क्या हो रहा है। असाइनमेंट चिपक नहीं रहा है। मैंने अपना टेस्ट केस भी दिखाने के लिए अपना कोड अपडेट किया। –