18

मैं जॉन पिताजी कोणीय शैली का उपयोग मार्गदर्शन मेरी नियंत्रक लगता है:जैस्मीन के साथ जॉन पापा vm.model इकाई परीक्षण का परीक्षण कैसे करें?

describe('Controller: testController', function() { 

    beforeEach(module('myApp')); 

    var testController; 

    beforeEach(inject(function ($controller) { 
     scope = {}; 

     testController = $controller('testController', { 
     }); 

    })); 

    it('should have vm.model defined and testController.vm.model is equal to controllerAs vm test', function() { 
     expect(testController.vm).toBeDefined(); 
     expect(testController.vm.model).toBeDefined();  
     expect(testController.vm.model.name).toEqual("controllerAs vm test"); 
    }); 
}); 

परिणाम::

टेस्ट

function testController() { 

    var vm = this; 

    vm.model = { name: "controllerAs vm test" }; 
} 

मेरे परीक्षण कोड की तरह दिखता है:

शैली John papa style controller style guide निम्नलिखित असफल: परिणाम संदेश: परिभाषित होने के लिए अपरिभाषित अपेक्षित। स्टैक

तो मेरा सवाल यह है कि हम vm.model और अन्य चरों का परीक्षण कैसे कर सकते हैं? मैं संबंधी दिशा-निर्देश में उचित मार्गदर्शन लाइन नहीं मिला है: controllers

उत्तर

24

vm उदाहरण खुद के बराबर है के माध्यम से vm = this;

इसलिए, सभी गुण वस्तु के बंद सीधे फांसी कर रहे हैं।

function foo(){ 
    var vm = this; 

    vm.name = 'Josh'; 
} 

var myFoo = new foo(); 
myFoo.name; // 'Josh'; 

तो तुम सब करने की जरूरत है अपनी उम्मीदों को बदलने vm संपत्ति को दूर करने के लिए है।

expect(testController).toBeDefined(); 
expect(testController.model).toBeDefined();  
expect(testController.model.name).toEqual("controllerAs vm test"); 

आदेश में इस साबित करने के लिए, यहाँ अपने सटीक उदाहरण है, और संबद्ध जैस्मीन परीक्षण। क्योंकि आप नियंत्रक में var vm = this सेट

function testController() { 
 

 
    var vm = this; 
 

 
    vm.model = { 
 
    name: "controllerAs vm test" 
 
    }; 
 
} 
 

 

 
angular.module('myApp', []) 
 
    .controller('testController', testController); 
 

 
describe('Controller: testController', function() { 
 

 
    beforeEach(module('myApp')); 
 

 
    var testController; 
 

 
    beforeEach(inject(function($controller) { 
 
    scope = {}; 
 

 
    testController = $controller('testController', {}); 
 

 
    })); 
 

 
    it('should have model defined and testController.model.name is equal to controllerAs vm test', function() { 
 
    expect(testController).toBeDefined(); 
 
    expect(testController.model).toBeDefined(); 
 
    expect(testController.model.name).toEqual("controllerAs vm test"); 
 
    }); 
 

 
    it('should not have a property called vm', function() { 
 
    expect(testController.vm).toBeUndefined(); 
 
    }); 
 
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.2.1/jasmine.css" rel="stylesheet" /> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.2.1/jasmine.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.2.1/jasmine-html.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.2.1/boot.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0-beta.4/angular.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0-beta.4/angular-mocks.js"></script>

+0

फ़ंक्शन के रूप में आपका उत्तर ठीक दिखता है लेकिन यहां मेरी समस्या तब होती है जब मैं नियंत्रक उदाहरण प्रारंभ करता हूं: testController = $ नियंत्रक ('testController', { }); तो testController.vm काम करना चाहिए लेकिन काम नहीं करता है।तो मेरा सवाल उन लोगों के लिए है जिन्होंने कोणीय जॉन पापा के नियंत्रक के साथ वीएम सिंटैक्स के रूप में काम किया है और जैस्मीन के साथ परीक्षण किया है। –

+0

@UtpalKumarDas - हुड '$ नियंत्रक 'के तहत बस' नया()' कॉल कर रहा है, इसलिए यह वैसे ही काम करता है। – Josh

+2

@UtpalKumarDas - मैं कई वर्षों से कोणीय के साथ काम कर रहा हूं, और जैस्मीन के साथ बहुत सारे परीक्षण किए हैं। मैं यह बताने की कोशिश कर रहा हूं कि यह एक कोणीय चीज नहीं है, बल्कि एक जावास्क्रिप्ट है। 'vm' नियंत्रक पर एक संपत्ति नहीं है ... यह एक चर है जो फ़ंक्शन स्कोप द्वारा बंद है। इसलिए इस तरह इस्तेमाल होने पर यह आपके नियंत्रक पर ** कभी ** मौजूद नहीं होगा। जेएस कैसे काम करता है '$ नियंत्रक' नहीं बदलता है। – Josh

6

testControllervm है। तो, अपने परीक्षण कोड अधिक अपने नियंत्रक कोड के समान बनाने के लिए, आप नियंत्रक

(function() { 
    'use strict'; 

    angular 
     .module('app') 
     .controller('testController', testController); 

    /* @ngInject */ 
    function testController() { 
     var vm = this; 

     // Primitives 
     vm.foo = 'bar'; 

     // Objects 
     vm.model = { 
      name: 'Batman' 
     }; 

     // Methods 
     vm.greet = function() { 
      return 'Hello There'; 
     }; 
    } 
})(); 

के लिए परीक्षण भीtestController

describe('Controller: testController', function() { 
    // we work with "vm" instead of "testController" to have consistent verbiage 
    // in test and controller 
    var vm; 

    beforeEach(module('app')); 
    beforeEach(inject(function ($controller) { 
     vm = $controller('testController', {}, {}); 
    })); 

    it('should have vm.model defined and testController.vm.model is equal to controllerAs vm test', function() { 

     // vm=this in controller 
     expect(vm) 
      .toBeDefined(); 

     // Testing primitives 
     expect(vm.foo) 
      .toBeDefined(); 
     expect(vm.foo) 
      .toEqual('bar'); 

     // Testing objects 
     expect(vm.model) 
      .toBeDefined(); 
     expect(vm.model.name) 
      .toEqual("Batman"); 

     // Testing a method 
     expect(vm.greet()) 
      .toBeDefined(); 
     expect(vm.greet()) 
      .toEqual('Hello There'); 
    }); 
}); 

संहिता की बजाय में vm के लिए अपने नियंत्रक स्थापित करने के लिए कोशिश कर सकते हैं उम्मीद है की यह मदद करेगा। शुभ लाभ।

1

मैं एक नया मॉड्यूल तैयार करूंगा और इसे ऐप मॉड्यूल में निर्भरता के रूप में इंजेक्ट कर सकता हूं ताकि इसे सरल और टेस्टेबल बनाया जा सके। जॉन पिताजी के स्टाइल गाइड के साथ नियंत्रक का परीक्षण:

(function() { 
    'use strict'; 

    angular 
    .module('test') 
    .controller('testController', testController); 

    function testController() { 
    var vm = this; 
    vm.model = { name: "controllerAs vm test" }; 
    } 
})(); 

कल्पना अब इस प्रकार दिखाई देगा:

'use strict'; 

describe('testController', function() { 
    var testController; 
    beforeEach(module('test')); 

    beforeEach(function() { 
    inject(function($injector) { 
     testController = $injector.get('$controller')('testController', {}); 
    }); 
    }); 

    it('should have model defined and testController.name is equal to controllerAs vm test', function() { 
    expect(testController).toBeDefined(); 
    expect(testController.name).toEqual("controllerAs vm test"); 
    }); 
}); 

आशा इस समान समाधान की तलाश में किसी को भी मदद करता है।

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