2014-01-24 2 views
0

$ scope에있는 컨트롤러 메소드를 테스트하려고합니다. 그 방법은 비동기 호출을하고 약속을 되 찾는다. 약속이 해결되면 결과는 $ scope의 변수에 할당됩니다.

내가 뽑아 내려고하는 테스트는 간단하다. $ scope 변수에 null을 할당하고, 메서드를 호출하고, 호출이 끝나기를 기다리고 결과가 $ scope 변수에 할당 될 것으로 기대한다.

어떤 이유로 든 약속이 해결되지 않습니다. 지금이 내가 그것을 테스트하기 위해 노력하고있어 어떻게

$scope.getSomething = -> 
     someFactory.find().then (response) -> 
     $scope.newValues = response.data 

: 단위 테스트의 목적

it 'should get something', -> 
    scope.newValues = {} 
    scope.getSomething() 
    expect(scope.newValues.someData).toBeDefined() 

를, 내가 조롱하고있어 여기에

http://plnkr.co/edit/qxs5Y54NvhA24Fk4MPv2?p=preview 컨트롤러 방법입니다 참조 "someFactory"는 $ q.when() 메서드를 사용하여, 내가 믿는 한 객체를 전달할 때 즉시 해결해야합니다. 여기에는 정말로 기다릴 필요가 없습니다. 이 모의 공장 :

mockSomeFactory = ($q) -> 
    { 
    find: -> 
     $q.when {someData: true} 
    } 

그리고 제공 $ 사용 컨트롤러로 주입 :

beforeEach module 'myAngularApp', ($provide) -> 
    $provide.factory "someFactory", mockSomeFactory 
    return 

내가 재스민의 실행, 대기 및 waitsFor 방법하지만 행운을 사용하려고했습니다. WaitsFor는 5000 밀리 초 후에도 항상 실패합니다. http://plnkr.co/edit/s2OL56jVCRK0Ecyycoz0?p=preview

누구나 전에 이런 일이 있었습니까?

답변

0

각도 약속은 다이제스트주기 동안에 만 해결됩니다. $ rootScope.apply()를 호출하면 약속이 해결됩니다.

root.$apply() 
expect(scope.newValues.data).toBeDefined() 

또한 변수의 이름을 변경하는 데 필요한 : 나는 consitant로 데이터를 사용하여 코드 http://plnkr.co/edit/dB6zTpZ1jYXOO1kGAYvb?p=preview

업데이트.

$scope.newValues.data = response.data 

# mock factory 
mockSomeFactory = ($q) -> 
{ 
    find: -> 
    $q.when {data: true} 
} 

희망이 그것은 일

+0

하는 데 도움이! 고맙습니다. plunkr을 고쳐 주셔서 감사합니다. 나는 rootScope와 $ apply()에 관한 문서를 읽을 것이다. – Blaiz

+0

문제 없습니다. $ q 문서도 확인해야합니다. 여기에 대한 설명은 http://docs.angularjs.org/api/ng.$q#description_differences-between-kris-kowals-q-and-$에서 볼 수 있습니다. q – hassassin

+1

고마워요. 나는 그 특정 단위 테스트가 단지 scope로 작동하도록 할 수 있었다. 실제로 $ digest()는 root가 아닌 $ apply()이다. – Blaiz

관련 문제