2012-09-04 18 views
28

için yasemin testinde bağımlılıkları enjekte etmek Test Spec dosyasıdır: Burada nasıl bir açısal öğe İşte

describe('Test main controller', function(){ 
     it('Should initialize value to Loading', function(){ 
      $scope = {} 
      ctrl = new mainNavController($scope) 
      expect($scope.wksp_name).toBe('Loading') 
     }) 
    }) 

kontrolör dosya

function mainNavController($scope) { 
    $scope.wksp_name = 'Loading...' 
    $scope.$on('broadCastWkspNameEvent', function (e, args) { 
     $scope.wksp_name = args 
    }) 
} 

mainNavController.$inject=['$scope'] 

olduğunu Ama benim test Object #<Object> has no method '$on'

söyleyerek başarısız Yasemin temel kurulumunu kullanıyorum.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
    <title>Jasmine Spec Runner</title> 

    <link rel="shortcut icon" type="image/png" href="testlib/jasmine-1.2.0/jasmine_favicon.png"> 
    <link rel="stylesheet" type="text/css" href="testlib/jasmine-1.2.0/jasmine.css"> 
    <script type="text/javascript" src="testlib/jasmine-1.2.0/jasmine.js"></script> 
    <script type="text/javascript" src="testlib/jasmine-1.2.0/jasmine-html.js"></script> 

    <!-- include source files here... --> 
    <script type="text/javascript" src="/static_files/js/test-specs/main-nav-spec.js"></script> 

    <!-- include spec files here... --> 
    <script type="text/javascript" src="/static_files/js/common/jquery/latest.js"></script> 
    <script type="text/javascript" src="/static_files/js/common/angular/angular-1.0.1.min.js"></script> 
    <script type="text/javascript" src="/static_files/js/common/angular/angular-resource-1.0.1.min.js"></script> 
    <script type="text/javascript" src="/static_files/js/section/main-nav-controller.js"></script> 

    <script type="text/javascript"> 
    (function() { 
     var jasmineEnv = jasmine.getEnv(); 
     jasmineEnv.updateInterval = 1000; 

     var htmlReporter = new jasmine.HtmlReporter(); 

     jasmineEnv.addReporter(htmlReporter); 

     jasmineEnv.specFilter = function(spec) { 
     return htmlReporter.specFilter(spec); 
     }; 

     var currentWindowOnload = window.onload; 

     window.onload = function() { 
     if (currentWindowOnload) { 
      currentWindowOnload(); 
     } 
     execJasmine(); 
     }; 

     function execJasmine() { 
     jasmineEnv.execute(); 
     } 

    })(); 
    </script> 

</head> 

<body> 
</body> 
</html> 

Yanlış mı yapıyorum? Bu şeyin nasıl çalıştığını anlayamıyorum :)

cevap

57

Test kodunuzdaki temel sorun, yeni operatörün kontrol ünitesi örneğini "el ile" oluşturmaya çalışmasıdır. Bunu yaparken AngularJS bağımlılıkları enjekte etme şansı yoktur.

  1. : http://jsfiddle.net/pkozlowski_opensource/7a7KR/3/

    yukarıdaki örnekte belirterek 2 şey değer vardır: İşte

    var $scope, ctrl; 
    
    //you need to inject dependencies first 
    beforeEach(inject(function($rootScope) { 
        $scope = $rootScope.$new();   
    })); 
    
    it('Should initialize value to Loading', inject(function($controller) { 
        ctrl = $controller('MainNavController', { 
         $scope: $scope 
        }); 
        expect($scope.wksp_name).toBe('Loading...'); 
    })); 
    

    tam jsFiddle link: Ne yapıyor olmalı angularjs bağımlılıkları enjekte izin vermektir Bağımlılıkları enjekte etmek için ngMock modülünden inject() yöntemini kullanabilirsiniz: https://docs.angularjs.org/api/ngMock/function/angular.mock.inject
  2. Bir denetleyici örneği oluşturmak için (bağımlılık enjeksiyonunu destekler) $ denetleyicisini kullanırsınız er hizmeti: Geçen not olarak http://docs.angularjs.org/api/ng.$controller

: Ben büyük harfle başlayan denetleyicileri adlandırma tavsiye ediyorum - biz değişken adları ile bunları karıştırmayın olacak bu şekilde.

3

ben size $ kapsamı benziyordu ederseniz örnek geçerdi

'$ üzerinde' saplama için ihtiyaç pkozowski tepki katılıyorum, ama daha doğrudan soru cevap:

$scope = { 
    $on: function() {} 
} 
+1

veya Yasemin casusu kullanmak –

16

Büyük @ pkozlowski.opensource tarafından cevap. Biraz daha detaylandırmak için ... Bazen kontrol cihazınız tarafından $scope.$on'un gerçekten arandığını iddia etmek de kullanışlı olabilir. Bu durumda aşağıda söylediği gibi $scope.$on gizlice izleyebilir:

beforeEach(inject(function($rootScope) { 
    $scope = $rootScope.$new();   
    spyOn($scope, '$on').andCallThrough(); 
})); 

Ve sonra $on etkinlik adı ve argümanları gibi bazı fonksiyonu ile çağrıldı iddia edebilir:

it('Should bind to "broadCastWkspNameEvent"', inject(function($controller) { 
    ctrl = $controller('MainNavController', { 
     $scope: $scope 
    }); 
    expect($scope.$on).toHaveBeenCalledWith('broadCastWkspNameEvent', jasmine.any(Function)); 
}));