2013-10-31 13 views
16

के साथ एक कोणीय वादा का परीक्षण करना निम्नलिखित परीक्षण विफल रहता है और मैं यह नहीं समझ सकता कि क्यों? मैं जैस्मीन के साथ पेशे/वादे का परीक्षण करने का तरीका जानने का प्रयास कर रहा हूं।जैस्मीन

त्रुटि

Expected undefined to be 'Resolved Data'. 

टेस्ट

describe('Queued Repository', function() { 
    var ctrl, 
     rootScope, 
     scope, 
     service; 

    beforeEach(function() { 
     module('testApp'); 

     inject(function ($rootScope, $controller, TestSrvc) { 
      rootScope = $rootScope; 
      scope = $rootScope.$new(); 
      service = TestSrvc; 
     }); 
    }); 

    afterEach(inject(function ($rootScope) { 
     $rootScope.$apply(); 
    })); 

    it('test something', function() { 
     expect(service.calculate(1, 5)).toBe(6); 
    }); 

    it('resolves promises', function() { 
     var result; 

     service.getPromise().then(function (data) { 
      result = data; 
     }); 

     rootScope.$apply(); 
     expect(result).toBe('Resolved Data'); 
    }); 
}); 

सेवा

var app = angular.module('testApp', []); 

app.service('TestSrvc', ['$q', '$timeout', '$http', function ($q, $timeout, $http) { 
    return { 
     getPromise: function() { 
      var d = $q.defer(); 

      $timeout(function() { 
       d.resolve('Defered Result'); 
      }, 5000); 

      return d.promise; 
     }, 
     getSomething: function() { 
      return "Test"; 
     }, 
     calculate: function (x, y) { 
      return x + y; 
     } 
    } 
}]); 
+0

क्या यह उम्मीद नहीं करनी चाहिए (परिणाम) .toEqual ('परिणाम का परिणाम'); '? –

+0

@ जोनाथनपलम्बो - हाँ, लेकिन यह अभी भी काम नहीं करता है। – Sam

+2

हां मैं देखता हूं कि आपका क्या मतलब है, परिणाम 'अपरिभाषित' है। अगर यह एक वादा था '$ http' लौटाया गया तो मैं आपके दावे से पहले '$ httpBackend.flush()' को कॉल करने का सुझाव दूंगा। हालांकि '$ q' सेवा का उपयोग करना एक और कहानी है। –

उत्तर

9

बुला $timeout.flush() ख का प्रयास करें पहले expect(result).toBe('Resolved Data');

+2

धन्यवाद एक टन! क्या मुझे अभी भी $ rootScope की आवश्यकता है। $ लागू()? – Sam

+1

मुझे "अप्रत्याशित अनुरोध" मिलता है http: //my.test.service/someObject/someId कोई अनुरोध अपेक्षित नहीं – FlavorScape

+0

आप उस फ़ाइल की पूरी सामग्री नहीं दिखा रहे हैं जिसे आप परीक्षण चाहते हैं, जहां से यह GET कॉल आती है? सेवा के लिए '$ http' क्यों इंजेक्शन दिया गया है? –

3

आपके उदाहरण में, आपको $timeout.flush() और $rootScope.$apply() दोनों को कॉल करने की आवश्यकता होगी।

स्पष्टीकरण: $timeout.flush() तुरंत चलाने के लिए सेवा में अपनी $timeout बाध्य करेगा। तब आपकी सेवा 'resolve' पर कॉल करेगी - लेकिन promise.then() को बाद के पाचन चक्र तक नहीं बुलाया जाएगा; इसलिए आपको $rootScope.$apply() को किसी भी 'समाधान' और 'घड़ियों' को प्रचारित करने के लिए कॉल करना होगा - जो तुल्यकालिक रूप से घटित होगा।

NOTE: जैस्मीन में, सुनिश्चित करें कि आपकी promise.then() समारोह प्रतीत होता है कि BEFORE$rootScope.$apply करने के लिए अपने कॉल अन्यथा यह promise.then() समारोह सक्रिय नहीं होगा। (मुझे पता नहीं चला कि जैस्मीन में यह मामला क्यों है।)