2013-12-12 10 views
36

मैं समारोह निम्नलिखित के साथ एक डाटा सेवा हैसाइनऑन के साथ कोई वादा कैसे करता है?

function getInsureds(searchCriteria) { 

    var deferred = $q.defer(); 

    insuredsSearch.get(searchCriteria, 
     function (insureds) { 
      deferred.resolve(insureds); 
     }, 
     function (response) { 
      deferred.reject(response); 
     }); 

    return deferred.promise; 
} 

मैं समारोह निम्नलिखित परीक्षण करना चाहते हैं:

function search() 
{ 
    dataService 
     .getInsureds(vm.searchCriteria) 
     .then(function (response) { 
      vm.searchCompleted = true; 

      if (response.insureds.length > 100) { 
       vm.searchResults = response.insureds.slice(0, 99); 
      } else { 
       vm.searchResults = response.insureds; 
      } 
     }); 
} 

मैं वादा कैसे ठूंठ हैं ताकि जब मैं getInsureds फोन यह वादा और बदले हल होगा मुझे तुरंत परिणाम। मैंने इस तरह (जैस्मीन परीक्षण) शुरू किया, लेकिन मैं अटक गया हूं, क्योंकि मुझे नहीं पता कि वादे को कैसे हल किया जाए और आवश्यक तर्कों में कैसे पारित किया जाए।

it("search returns over 100 results searchResults should contain only 100 records ", function() { 

    var results103 = new Array(); 

    for (var i = 0; i < 103; i++) { 
     results103.push(i); 
    } 

    var fakeSearchForm = { $valid: true }; 
    var isSearchValidStub = sinon.stub(sut, "isSearchCriteriaValid").returns(true); 

    var deferred = $q.defer(); 
    var promise = deferred.promise; 
    var dsStub = sinon.stub(inSearchDataSvc, "getInsureds").returns(promise); 

    var resolveStub = sinon.stub(deferred, "resolve"); 

    //how do i call resolve and pass in results103 

    sut.performSearch(fakeSearchForm); 

    sinon.assert.calledOnce(isSearchValidStub); 
    sinon.assert.calledOnce(dsStub); 

    sinon.assert.called(resolveStub); 

    expect(sut.searchResults.length).toBe(100); 

}); 

उत्तर

16

आपको खोज फ़ंक्शन को कॉल करने से पहले केवल वादे को हल करना होगा। इस तरह आपका स्टब एक हल किए गए वादे को वापस कर देगा और then तुरंत कॉल किया जाएगा। तो

var resolveStub = sinon.stub(deferred, "resolve"); 

के बजाय आप अपने नकली प्रतिक्रिया डेटा

deferred.resolve({insureds: results103}) 
+3

यह निम्नलिखित के साथ myClass.myFunction ठूंठ कर सकते हैं आजकल हम जिन वादों का उपयोग कर रहे हैं, उनके साथ सहमत नहीं हैं। [वादे/ए + कहें] (https://promisesaplus.com/) "पूर्ण या ऑनरेजेड को तब तक नहीं बुलाया जाना चाहिए जब तक कि निष्पादन संदर्भ स्टैक में केवल प्लेटफ़ॉर्म कोड न हो"। – Kos

+12

असल में, मैंने यह किया है: 'var resolStub = sinon.stub (स्थगित," हल करें ")। रिटर्न ({तब: फ़ंक्शन() {}});' –

5

साथ टाल मैं एक ऐसी ही स्थिति और स्वीकार किए जाते हैं जवाब था और टिप्पणियों से काम नहीं कर रहे थे समाधान करेगा, लेकिन this question के साथ-साथ वे मेरे हल में मदद की यह निम्नलिखित तरीके से है। मुझे आशा है कि यह किसी के लिए सहायक होगा।

var Promise = require('bluebird'); 

var deferred = Promise.defer(); 
stub = sinon.stub(deferred, 'resolve').returns(deferred.promise); 

deferred.resolve({data: data}); 
// or 
deferred.reject(new Error('fake error')); 
+1

यह मेरा दिन सहेजा गया :) –

1

मुझे एक और विकल्प मिला है। अन्य तरीकों से बहुत दर्द मुक्त है।

आप इस एनपीएम पैकेज का उपयोग कर सकते हैं: sinon-stub-promise

यह अधिकतर विवरणों को सारणीबद्ध करता है, ताकि आपको फिर से पहिया का आविष्कार न करना पड़े। लंबे समय तक एक वादा अनुकरण करने के लिए संघर्ष करने के बाद मेरे परीक्षण लिखने में मेरी मदद की।

उम्मीद है कि यह मदद करता है!

15

वर्तमान सिनोन संस्करण v2.3.1 पर, आप stub.resolves(value) और stub.rejects(value) समारोह का उपयोग कर सकते

उदाहरण के लिए, आप कोड

sinon.stub(myClass, 'myFunction').resolves('the value you want to return'); 

या

sinon.stub(myClass, 'myFunction').rejects('the error information you want to return'); 
संबंधित मुद्दे