2013-04-13 96 views
0

我正在嘗試在Karma中爲基於AngularJS的Web應用程序創建我的第一個單元測試。我正在使用Jasmine作爲測試框架。AngularJS + Karma(Testacular) - 單元測試失敗

我的單元測試是這樣的:

describe('FooBar', function() { 

    describe('FBCtrl', function() { 
     var scope, ctrl; 

     beforeEach(function() { 
      scope = {}; 
      ctrl = new FBCtrl(scope); 
     }); 

     it('should have correct gender values', function() { 
      expect(scope.values[0].values).toBe(["M", "F"]); 
     }); 
    }); 
}); 

現在,當我運行測試,我得到以下形式的錯誤:

Chrome 26.0 (Linux) FooBar FBCtrl should have correct gender values FAILED 
Expected [ 'M', 'F' ] to be [ 'M', 'F' ]. 
Error: Expected [ 'M', 'F' ] to be [ 'M', 'F' ]. 
     at null.<anonymous> //followed by the js file given has input to Karma 

這種期望的LHS是一個變量定義在控制器的範圍內。可以看出,價值已被拿起,並且比較也似乎是正確的 - 但卡瑪報告這是一個失敗/錯誤。

任何想法爲什麼?

回答

2

那麼這是因爲在JavaScript表達式['val']===['val']總是評估爲false。因此,業力使用相同的東西來比較值,並且它也失敗了。最簡單的解決方案,將是他們這樣的比較:

var values = scope.values[0].values; 
expect(values.toString()).toBe(["M", "F"].toString()); 

或者你也可以做這樣的事情:

var values = scope.values[0].values; 
expect(values.length).toBe(2); 
expect(values).toContain('M'); 
expect(values).toContain('F'); 

或者,如果順序很重要,以及:

var values = scope.values[0].values; 
expect(values.length).toBe(2); 
expect(values[0]).toBe('M'); 
expect(values[1]).toBe('F'); 
4

代替使用匹配器toBe使用toEqual

Jasmine's toBe在Javascript中使用===運算符。 toEqual使用巧妙比較數組的自定義函數。

0

有幾件事你可能想在這裏改變。除非你有充分的理由,否則不應該真正嵌套描述。你在beforeEach中錯誤地實例化了你的控制器(認爲DI是角度的)。另外,當您可能指「toEqual」時,您正在使用「toBe」。試試這個代碼:

(function() { 
'use strict'; 

describe('MainController', function(){ 
    var controller; 
    var scope; 

    beforeEach(module('MY_APP')); 
    beforeEach(inject(function($controller) { 
     scope = {}; 
     controller = $controller('MainController', {$scope: scope}) 
    })) 

    it('should be defined.', function() { 
     expect(controller).toBeDefined(); 
    }); 

    it('should have correct gender values.', function() { 
     expect(scope.values[0].values).toEqual(["M", "F"]); 
    }) 
})