2012-05-27 8 views
5

तो मैं पूरी परीक्षण चीज में नया हूं (मैं उन लोगों में से एक हूं जिन्होंने कहा है कि 'मुझे यूनिट परीक्षण लिखना चाहिए ...' लेकिन कभी भी ऐसा नहीं हुआ: - पी)। अब मैं इस परियोजना के लिए यूनिट परीक्षण लिख रहा हूं। मैं testacular + जैस्मीन का उपयोग कर रहा हूँ, चीजों को संकलित करने के लिए ब्राउज़र के साथ। जब तक मैंने बहुत कुछ AngularJS इंजेक्शन-सामान करने की कोशिश करना शुरू नहीं किया तब तक मुझे कोई समस्या नहीं थी।कोणीयजेएस - इंजेक्शन के साथ मूल परीक्षण

अभी मैं बस अपने सिर को पाने के लिए एनजी मॉडल का परीक्षण करने की कोशिश कर रहा हूं।

मैं एक testacular.conf फ़ाइल जो सब कुछ आवश्यक भी शामिल है:

files = [ 
    '../lib/jquery.js', 
    '../lib/angular.js', 
    './lib/jasmine.js', 
    './lib/angular-mocks.js', 
    JASMINE_ADAPTER, 
    './tests.js' //compiled by browserify 
]; 

मैं अपने नियंत्रक को परिभाषित किया है (MainCtrl.coffee)

MainCtrl = ($scope, $rootScope) -> 
    $scope.hello = 'initial' 

module.exports = (angularModule) -> 
    angularModule.controller 'MainCtrl', ['$scope', '$rootScope', MainCtrl] 
    return MainCtrl 

और मैं अपने परीक्षण में ही है: (_MainCtrlTest। कॉफी, MainCtrl.coffee रूप में एक ही निर्देशिका) में

testModule = angular.module 'MainCtrlTest', [] 
MainCtrl = require('./MainCtrl')(testModule) 

describe 'MainCtrlTest', -> 
    scope = null 
    elm = null 
    ctrl = null 

    beforeEach inject ($rootScope, $compile, $controller) -> 
     scope = $rootScope.$new() 
     ctrl = $controller MainCtrl, $scope: scope 
     elm = $compile('<input ng-model="hello"/>')(scope) 

    describe 'value $scope.hello', -> 

     it 'should initially equal input value', -> 
      expect(elm.val()).toBe scope.hello 

     it 'should change when input value changes', -> 
      scope.$apply -> elm.val('changedValue') 
      expect(scope.hello).toBe elm.val() 

परीक्षण तुरंत विफल रहता है, inp साथ ut's elm.val() रिक्त लौट रहा है, और स्कोप। वह इच्छित मूल्य ('प्रारंभिक', MainCtrl.coffee में सेट)

मैं यहां क्या गलत कर रहा हूं?

उत्तर

10

इस काम कर पाने के लिए आपको scope.$apply() क्या करने की जरूरत: ढांचे का परीक्षण न करें

it 'should initially equal input value', -> 
    scope.$apply() 
    expect(elm.val()).toBe scope.hello 

, परीक्षण अपने कोड

आपका परीक्षण कोणीय का बंधन है कि क्या परीक्षण करने के लिए कोशिश कर रहा है, और ng-model काम करता है। आपको ढांचे पर भरोसा करना चाहिए और इसके बजाय अपने कोड का परीक्षण करना चाहिए।

आपका कोड है:

  1. नियंत्रक (प्रारंभिक स्थापित करने scope.hello मूल्य)
  2. एचटीएमएल टेम्पलेट्स (और सभी बंधन, निर्देशों वहाँ में)

आप पहले एक बहुत परीक्षण कर सकते हैं आसानी से, किसी भी डोम को छूए बिना। यह AngularJS की सुंदरता है - दृश्य/तर्क के मजबूत अलगाव।

it 'should init hello', -> 
    expect(scope.hello).toBe 'initial' 

दूसरा एक (टेम्पलेट + बंधन) परीक्षण करने के लिए, आप एक E2E परीक्षण करना चाहते हैं:

इस नियंत्रक में, वहाँ लगभग परीक्षण करने के लिए कुछ भी नहीं है, लेकिन प्रारंभिक मूल्य है। आप मूल रूप से परीक्षण करना चाहते हैं, भले ही टेम्पलेट में बाध्यकारी आदि में कोई टाइपो न हो ... तो आप वास्तविक टेम्पलेट का परीक्षण करना चाहते हैं। यदि आप परीक्षण के दौरान एक अलग HTML को रेखांकित करते हैं, तो आप AngularJS के अलावा कुछ भी परीक्षण नहीं कर रहे हैं।

+0

धन्यवाद वोजता। यह अब काम करता है :-) हाँ, मैं सिर्फ एक परीक्षण के अंदर इंजेक्शन और नियंत्रक त्वरण कैसे करें, इसके बारे में अपने सिर को पाने के लिए एक बुनियादी कोणीय परीक्षण करने की कोशिश कर रहा था। यह सब वास्तव में सरल है, जो महान है। –

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

  • कोई संबंधित समस्या नहीं^_^