2013-04-13 5 views
0

AngularJS 기반 웹 응용 프로그램에 대한 카르마에서 첫 번째 단위 테스트를 만들려고합니다. 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"]); 
     }); 
    }); 
}); 

을 지금, 나는 테스트를 실행할 때, 나는 다음과 같은 형태의 오류 얻을 :이 기대의 LHS는 변수가 정의 된

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 

을 컨트롤러의 범위 내부. 알 수 있듯이, 가치가 선택되었고 비교도 정확하다고 보입니다. 그러나 Karma는 이것을 실패/오류로보고합니다.

왜 그런가?

답변

2

자바 스크립트 표현식 ['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[0]).toBe('M'); 
expect(values[1]).toBe('F'); 
4

대신 :

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

또는 순서뿐만 아니라 중요한 경우

정규 표현식을 사용하여 toBe 사용 toEqual

재스민의 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"]); 
    }) 
}) 
관련 문제