2013-08-27 24 views
24

मैं angularJS परीक्षण के लिए jasmine का उपयोग कर रहा हूँ।जैस्मीन में "नियंत्रक के रूप में" वाक्यविन्यास के साथ स्कोप चर का उपयोग कैसे करें?

<div ng-controller="configCtrl as config"> 
    <div> {{ config.status }} </div> 
</div> 

मैं कैसे चमेली में इन "गुंजाइश" चर का उपयोग कर सकते हैं: मेरे विचार में, मैं वाक्य रचना "के रूप में नियंत्रक" उपयोग कर रहा हूँ? "कंट्रोलर के रूप में" क्या संदर्भित करता है?

describe('ConfigCtrl', function(){ 
    var scope; 

    beforeEach(angular.mock.module('busybee')); 
    beforeEach(angular.mock.inject(function($rootScope){ 
     scope = $rootScope.$new(); 

     $controller('configCtrl', {$scope: scope}); 
    })); 

    it('should have text = "any"', function(){ 
     expect(scope.status).toBe("any"); 
    }); 
}); 

scope.status समाप्त होता है कॉलिंग, सुनिश्चित करें के लिए, त्रुटि के साथ:

Expected undefined to be "any". 

अद्यतन: मेरा परीक्षण ऐसा दिखाई देता नियंत्रक (टाइपप्रति से संकलित जावास्क्रिप्ट) इस तरह दिखता है:

var ConfigCtrl = (function() { 
    function ConfigCtrl($scope) { 
     this.status = "any"; 
    } 
    ConfigCtrl.$inject = ['$scope']; 
    return ConfigCtrl; 
})(); 
+0

कम से कम, आपको क्या करना चाहिए 'उम्मीद (scope.config.status) .toBe (" किसी भी ");' – zsong

+0

कोड 'configCtrl' के लिए वाक्य रचना के रूप में लगभग' कर $ गुंजाइश की तरह है प्रदान करें। config = this; 'और 'this.status =" any ";'। –

+0

यह काम करता है अगर मैं अपने नियंत्रक में '$ scope.config = this;' मैन्युअल रूप से परिभाषित करता हूं। लेकिन मुझे लगता है कि ऐसा नहीं होना चाहिए, है ना? – 3x14159265

उत्तर

46

समाधान आपके नियंत्रक को आपके परीक्षण में तुरंत चालू करते समय "नियंत्रक के रूप में" वाक्यविन्यास का उपयोग करना है । विशेष रूप से:

$ नियंत्रक ('configCtrl कॉन्फ़िगर', {$ स्कोप: स्कोप}) के रूप में;

उम्मीद (scope.config.status) .toBe ("any");

निम्नलिखित अब पारित करना चाहिए:

describe('ConfigCtrl', function(){ 
    var scope; 

    beforeEach(angular.mock.module('busybee')); 
    beforeEach(angular.mock.inject(function($controller,$rootScope){ 
     scope = $rootScope.$new(); 

     $controller('configCtrl as config', {$scope: scope}); 
    })); 

    it('should have text = "any"', function(){ 
     expect(scope.config.status).toBe("any"); 
    }); 
}); 
+0

दुर्भाग्य से यह मेरे लिए काम नहीं करता है। मुझे त्रुटि मिलती है 'त्रुटि: तर्क' configCtrl कॉन्फ़िगरेशन के रूप में 'एक फ़ंक्शन नहीं है, लाइन '$ नियंत्रक (' configCtrl के रूप में config ', {$ scope: पर पथ/to/angular.js (पंक्ति 1039) में अपरिभाषित हो गया है। स्कोप}); ' – 3x14159265

+0

काम करना चाहिए, यहां पर" नियंत्रक के रूप में "सुविधा के लिए AngularJS का परीक्षण कोड देखें https://github.com/angular/angular.js/blob/v1.2.0-rc.3/test/ng/ नियंत्रकSpec.js # L112 – Beyers

+0

@ 3x14159265 दो अन्य चीजों को जांचने/प्रयास करने के लिए: (1) $ नियंत्रक इंजेक्ट करें, उदाहरण के लिए 'पहले से (इंजेक्ट (फ़ंक्शन ($ नियंत्रक, $ रूटस्कोप) {'और (2) सुनिश्चित करें कि आपका मॉड्यूल जहां configCtrl परिभाषित किया गया है लोड हो गया है। मैं इस वाक्यविन्यास का उपयोग AngularJS 1.2.0 RC3 में बिना किसी त्रुटि के कर रहा हूं। – Beyers

15

हम controller as सिंटैक्स का उपयोग कर रहे हैं, हमारे परीक्षण में $ rootScope इंजेक्षन करने की आवश्यकता नहीं होना चाहिए। निम्नलिखित ठीक काम करना चाहिए।

describe('ConfigCtrl', function(){ 
    beforeEach(module('busybee')); 

    var ctrl; 

    beforeEach(inject(function($controller){ 
     ctrl = $controller('ConfigCtrl'); 
    })); 

    it('should have text = "any"', function(){ 
     expect(ctrl.status).toBe("any"); 
    }); 
}); 
+7

कभी-कभी आपको अभी भी अपने नियंत्रक के अंदर $ स्कोप तक पहुंच की आवश्यकता होती है, भले ही आप 'नियंत्रक के रूप में' – Beyers

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