2013-08-27 5 views
24

AngularJS testi için jasmine kullanıyorum.Jasmine'de "Controller as" sözdizimi ile kapsam değişkenleri nasıl kullanılır?

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

nasıl yasemin bu "kapsam" değişkenleri kullanabilirsiniz: Benim görünümlerinde, ben sözdizimi "olarak Kontrolörü" kullanıyorum? "Denetleyici" nin anlamı nedir?

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"); 
    }); 
}); 

kesin, scope.status biter çağrılması, hata ile:

Expected undefined to be "any". 

GÜNCELLEME: Testim aşağıdaki gibi görünür Denetleyici (yazılardan derlenmiş javascript) şöyle görünür:

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

En azından, sen 'bekliyoruz (scope.config.status) .toBe ("herhangi bir") yapmalıdır;' – zsong

+0

'sözdizimi neredeyse' $ kapsamını yapıyor gibidir configCtrl' için kodu girin. config = this; 've this.status =" any ";' yapmak. –

+0

"$ scope.config = this;" öğesini el ile denetleyicimde tanımladığımda çalışır. Ama bence öyle olması gerekmiyor, değil mi? – 3x14159265

cevap

46

Çözüm, denetleyicinizi sınamada başlatırken "denetleyici olarak" sözdizimini kullanmaktır. . Spesifik olarak:

$ denetleyici ('configCtrl yapılandırması olarak', {$ kapsam: kapsam});

(scope.config.status) .toBe ("any");

şu anda geçmelidir:

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

maalesef bu benim için çalışmıyor. Hata alıyorum 'Hata: Argüman' configCtrl config olarak 'bir fonksiyon değil, undefined yolunda/to/angular.js (satır 1039) 'satırında' $ controller ('configCtrl config' olarak yapılandırılır, {$ scope: kapsamı}); ' – 3x14159265

+0

Çalışmalı, burada" denetleyici olarak "özelliği için AngularJS kendi test koduna bakın https://github.com/angular/angular.js/blob/v1.2.0-rc.3/test/ng/ controllerSpec.js # L112 – Beyers

+0

@ 3x14159265 Kontrol etmek/denemek için iki şey daha: (1) $ denetleyicisini 'beforeEach (enjekte et (function ($ controller, $ rootScope) {'. ve (2) configCtrl'nin tanımlandığı modülün yüklü olduğundan emin olun.Bu anormallikleri herhangi bir hata olmadan AngularJS 1.2.0 RC3'te kullanıyorum – Beyers

15

biz controller as sözdizimi kullanırken, bizim teste $ rootScope enjekte etmeye gerek olmamalıdır. Aşağıdakiler gayet iyi çalışmalıdır.

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

Bazen "controller as" kullanıyor olsanız bile denetleyicinizin $ kapsamına erişmeniz gerekebilir. – Beyers