2013-04-30 2 views
2

단위 테스트에서 AngularJS 관찰자와 관련된 문제가 발생했습니다.AngularJS watcher : 단위 테스트에서 newValue와 동일한 oldValue

응용 프로그램을 실행할 때 예상대로 작동하지만 oldValue는 newValue와 항상 같아서 watchers에서 이러한 값 사이의 부등호를 테스트 할 때 실패한 테스트가 발생합니다 (일반적으로 생각합니다).

다음을 설명하기 위해 약간의 plunkr을 만들었습니다. http://plnkr.co/edit/a5er4f?p=preview 동작을 관찰하려면 콘솔을 살펴보십시오. index.html에서 일반 모드는 모든 것이 좋으며 oldValue는 항상 newValue와 다릅니다. 재스민 기자는 항상 동일합니다.

이것에 대한 의견이 있으십니까? 아마 내가 시험에서 뭔가 잘못하고 있는거야?

도움 주셔서 감사합니다.

답변

2

몇 가지 진행됩니다

첫째 : 당신이 올바른지 $ 컨트롤러를 사용하여 테스트 appSpec.js에서 컨트롤러를 인스턴스화된다. 그러나 <body ng-controller="WatchCtrl">을 사용하여 jasmine-reporter.html을 사용하여 컨트롤러를 인스턴스화합니다. 두 명의 관찰자가 테스트를 망칠 수 있습니다. 제거하고 html 태그에서 ng-app = "testApp"를 제거하십시오. 당신은 angular.mock.module로 앱 초기화를 처리합니다.

두 번째 : $ watch가 초기화 중에 newVal == oldVal == null으로 트리거됩니다. $ watch에 대한 설명서는 http://docs.angularjs.org/api/ng을 참조하십시오. $ rootScope.Scope. 그래서 당신은 하나의 $ watch 루프를 기대해야한다. 여기서 newVal = oldVal은 컨트롤러 인스턴스화마다이다.

또한 테스트로 실행하면 $log이 조롱 되었기 때문에 테스트에서 aValue를 변경할 때 출력이 표시되지 않습니다. console.log을 사용하여 테스트 메시지를 볼 수 있습니다. 변경

Plnkr 만든 :.. http://plnkr.co/edit/voPQax?p=preview

+0

안녕 Jmr, 고마워요. Plnkr을 저장하지 않은 것으로 보입니다. 여전히 원본과 동일합니다. 이중 선언에 대해, 유감스럽게도, 당신 말이 맞지만 카르마가 쓴 평범한 재스민 테스트에서 HTML없이 이것을 재현 할 수 있습니다. 또한 테스트에서 컨트롤러를 인스턴스화하는 올바른 방법은 무엇입니까? 나는 항상이 방법을 보았다. 공식 문서 : http://docs.angularjs.org/guide/dev_guide.mvc.understanding_controller –

+0

Plunkr이 저장되었습니다 (변경 사항은 대부분 jasmine-reporter.html에 있음) – Jmr

+0

컨트롤러를 사용하여 올바른 방법을 인스턴스화합니다. beforeEach()의 $ 컨트롤러 서비스. – Jmr

3

관찰자가 테스트하기 위해 수동으로 $scope.$apply()으로 전화해야합니다. 그렇지 않으면 값 변경 사항을 확인하지 않고 그대로 유지됩니다.

+2

그가 $ 범위를 호출 $ 다이제스트() 그래서 $ 범위 $ 적용() 당신의 도움에 대한 –

+0

감사를 필요하지 않습니다, 사실 모두를 시도했지만 아제로 말한 , $ diggest는 충분해야합니다 –

관련 문제