2012-09-04 19 views
28

यहाँ के लिए चमेली परीक्षा में निर्भरता सुई परीक्षण कल्पना फ़ाइल है:कैसे एक कोणीय आइटम

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

यहाँ नियंत्रक फ़ाइल

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

mainNavController.$inject=['$scope'] 

है लेकिन अपने परीक्षण कह विफल रहता है Object #<Object> has no method '$on'

मैं जैस्मीन के मूल सेटअप का उपयोग कर रहा हूँ।

<!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> 

यह क्या है कि मैं गलत कर रहा हूं? मैं यह समझने में सक्षम नहीं हूं कि इस बात को कैसे काम करना है :)

उत्तर

57

आपके परीक्षण कोड के साथ मुख्य समस्या यह है कि यह नए ऑपरेटर का उपयोग करके "हाथ से" नियंत्रक के उदाहरण को बनाने का प्रयास करता है। ऐसा करने पर AngularJS पर निर्भरता को इंजेक्ट करने का कोई मौका नहीं है।

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

    वहाँ 2 बातें ऊपर के उदाहरण में ध्यान देने योग्य हैं:

    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...'); 
    })); 
    

    यहां एक संपूर्ण jsFiddle के लिए लिंक है: आप क्या कर किया जाना चाहिए AngularJS निर्भरता इंजेक्षन अनुमति देने के लिए है आप ngMock मॉड्यूल से इंजेक्ट() विधि का उपयोग निर्भरताओं को इंजेक्ट करने के लिए कर सकते हैं: https://docs.angularjs.org/api/ngMock/function/angular.mock.inject

  2. नियंत्रक उदाहरण (जो निर्भरता इंजेक्शन का समर्थन करता है) बनाने के लिए आप $ नियंत्रण का उपयोग करेंगे एर सेवा: http://docs.angularjs.org/api/ng.$controller

पिछले टिप्पणी के रूप में: - इस तरह से हम उन्हें चर नाम के साथ भ्रमित नहीं होंगे मैं एक अपरकेस अक्षर से शुरू होने वाले नियंत्रकों नामकरण सलाह देंगे।

3

मैं pkozowski की प्रतिक्रिया से सहमत है, लेकिन अधिक सीधे आपके सवाल का जवाब देने के लिए, आप अगर अपने $ गुंजाइश की तरह दिखाई देता है आपकी उदाहरण से होकर गुजरेगा

'$ पर' बाहर ठूंठ की जरूरत है:

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

या जैस्मीन जासूस का उपयोग –

16

महान @ pkozlowski.opensource द्वारा जवाब। थोड़ा और विस्तार करने के लिए ... कभी-कभी यह दावा करने के लिए भी आसान हो सकता है कि $scope.$on वास्तव में आपके नियंत्रक द्वारा बुलाया गया था। इस मामले में आप $scope.$on पर जासूसी कर सकते हैं के रूप में नीचे ने कहा:

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

और फिर आप जोर कर सकते हैं कि $on आपके घटना नाम और तर्क के रूप में कुछ समारोह के साथ बुलाया गया था:

it('Should bind to "broadCastWkspNameEvent"', inject(function($controller) { 
    ctrl = $controller('MainNavController', { 
     $scope: $scope 
    }); 
    expect($scope.$on).toHaveBeenCalledWith('broadCastWkspNameEvent', jasmine.any(Function)); 
})); 
संबंधित मुद्दे