2013-07-24 3 views
28

बहुत पढ़ने के बाद, ऐसा लगता है कि एंगुलरजेएस नियंत्रक से वेब सेवा को कॉल करने का अनुशंसित तरीका कारखाने का उपयोग करना और उससे वादा करना है।

यहां मेरे पास एक साधारण कारखाना है जो नमूना एपीआई कहता है।

myApp.factory('MyFactory', ['$http',function($http) { 
var people = { 
     requestPeople: function(x) { 
      var url = 'js/test.json'; 
      return $http.get(url); 
     } 
    }; 
return people; 
}]); 

और यह मैं इसे कैसे नियंत्रक

myApp.controller('MyCtrl1', ['$scope', 'MyFactory', function ($scope, MyFactory) { 
     MyFactory.requestPeople(22).then(function(result) { 
      $scope.peopleList = result; 
     }); 
}]); 

हालांकि यह ठीक काम करता है, मैं result कि जब then कहा जाता है में पारित हो जाता है नकली करने में सक्षम होना चाहते हैं में कहते हैं। क्या यह संभव है?

मेरे प्रयास ने अब तक कुछ भी नहीं बनाया है।

//Fake service 
var mockService = { 
    requestPeople: function() { 
     return { 
      then: function() { 
       return {"one":"three"}; 
      } 
     } 

    } 
}; 


//Some setup 
beforeEach(module('myApp.controllers')); 
var ctrl, scope; 

beforeEach(inject(function ($rootScope, $controller) { 
    scope = $rootScope.$new(); 

    ctrl = $controller('MyCtrl1', { $scope: scope, MyFactory: mockService }); 
})); 

//Test 
it('Event Types Empty should default to false', inject(function() { 
    expect(scope.peopleList.one).toBe('three'); 
})); 

त्रुटि है कि मैं जब कर्म धावक में यह चल रहा हो,

लेखन त्रुटि है: 'अनिर्धारित' एक वस्तु नहीं है ('scope.peopleList.one' का मूल्यांकन)

यह मेरा प्रयास है

मैं इस परीक्षण को अपने मॉक किए गए डेटा के साथ कैसे काम कर सकता हूं?

+0

मैंने इसके बारे में पढ़ा है, लेकिन मेरा नियंत्रक $ http नहीं लेता है। क्या आप इसका मतलब बता सकते हैं? – Mendhak

उत्तर

38

मुझे नहीं लगता कि $ httpBackend आप यहां क्या कर रहे हैं, आप चाहते हैं कि पूरे कारखाने को $ http पर निर्भरता के बिना मजाक किया जाए?

$q पर विशेष रूप से परीक्षण शीर्षलेख के अंतर्गत कोड नमूना देखें। आपकी समस्या का कोड के साथ हल किया जा सकता है इस तरह दिखता है कि:

'use strict'; 

describe('mocking the factory response', function() { 

    beforeEach(module('myApp.controllers')); 

    var scope, fakeFactory, controller, q, deferred; 

    //Prepare the fake factory 
    beforeEach(function() { 
     fakeFactory = { 
      requestPeople: function() { 
       deferred = q.defer(); 
       // Place the fake return object here 
       deferred.resolve({ "one": "three" }); 
       return deferred.promise; 
      } 
     }; 
     spyOn(fakeFactory, 'requestPeople').andCallThrough(); 
    }); 

    //Inject fake factory into controller 
    beforeEach(inject(function ($rootScope, $controller, $q) { 
     scope = $rootScope.$new(); 
     q = $q; 
     controller = $controller('MyCtrl1', { $scope: scope, MyFactory: fakeFactory }); 
    })); 

    it('The peopleList object is not defined yet', function() { 
     // Before $apply is called the promise hasn't resolved 
     expect(scope.peopleList).not.toBeDefined(); 
    }); 

    it('Applying the scope causes it to be defined', function() { 
     // This propagates the changes to the models 
     // This happens itself when you're on a web page, but not in a unit test framework 
     scope.$apply(); 
     expect(scope.peopleList).toBeDefined(); 
    }); 

    it('Ensure that the method was invoked', function() { 
     scope.$apply(); 
     expect(fakeFactory.requestPeople).toHaveBeenCalled(); 
    }); 

    it('Check the value returned', function() { 
     scope.$apply(); 
     expect(scope.peopleList).toBe({ "one": "three" }); 
    }); 
}); 

मैं चारों ओर कुछ परीक्षण जोड़ दिया है क्या $ लागू होता है, मुझे नहीं पता था कि यह साथ खेल जब तक मैं शुरू कर दिया!

गोग

+0

यह पूरी तरह से काम किया। मैं कुछ ऐसा ही आया था लेकिन जो भी मैं लापता था वह 'उचित' लौटने वाला था, और अब '$ scope.apply() 'अधिक समझ में आता है। – Mendhak

+0

मुझे इस कोड पर सफलता इकाइयों के परीक्षण की सफलता मिली है। हालांकि, "नियंत्रक के रूप में" वाक्यविन्यास में जाना, यह स्पष्ट नहीं है कि पास करने के लिए परीक्षण को कैसे संशोधित किया जाए। समस्या यह प्रतीत होती है कि '' MyCtrl1 foo 'के रूप में समस्या का उपयोग करना समस्या है। यहां तक ​​कि 'not.toBeDefined' परीक्षण' TypeError के साथ विफल रहता है: अपरिभाषित एक फ़ंक्शन नहीं है '। –

+1

यहां 'spyOn' कथन का महत्व क्या है। मैंने इसे टेस्ट चश्मे से हटा दिया और परीक्षण अभी भी सफलतापूर्वक पारित हो गया। – Aakash

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

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