2012-05-27 45 views
5

所以我對整個測試的新東西(我一直說'我應該寫單元測試...'的人之一,但從來沒有結束過這樣做: - p)。 我現在正在爲這個項目編寫單元測試。我正在使用testacular + Jasmine,通過browserify來編譯東西。直到我開始嘗試做很多AngularJS注入東西之前,我一直沒有問題。AngularJS - 基本測試與注射

現在,我只是試圖做一個ng模型的測試,讓我的頭部圍繞它。

我有一個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的elm.val()返回空白,並且scope.hello返回預期值('initial',在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. HTML模板(和所有綁定,指示在那裏)

可以很測試的第一個很容易,甚至沒有觸及任何DOM。這就是AngularJS的美妙之處 - 強大的視圖/邏輯分離。

在這種控制器,幾乎沒有什麼可以測試,但初始值:

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

要測試第二個(模板+綁定),你想要做的端到端測試。你基本上想測試,模板是否不包含任何綁定等錯誤...所以你想測試真正的模板。如果您在測試期間內聯了一個不同的html,那麼您只能測試AngularJS。

+0

謝謝Vojta。它現在可以工作:-)我只是試圖做一個基本的角度測試,讓我的腦海中圍繞如何在測試中進行注入和控制器實例化。這一切都很簡單,這很好。 –