2016-07-02 3 views
1

내가 호출 HTTP 전에 약속을 기다리는 코드를 테스트하기 위해 노력하고있어 :

코드 :

function foo() { 
    return Parse.Promise.as(1).then(function(one) { 
    return $http.get('/bar'); 
    }); 
} 

테스트 :

describe('foo', function() { 
    it('gets', function(done) { 
    $httpBackend.expect('GET', '/bar').respond(200); 
    foo().then(function(res) { 
     expect(res.status).to.be.equal(200); 
     done(); 
    }); 
    $httpBackend.flush(); 
    }); 
}); 

오류 :

1) gets 
    foo 
    No pending request to flush ! 

guess is beacuse Parse.Promise은 약속 해상도를 지연시키고 $httpBackend.flush이 호출되면 http 요청이 이루어지지 않았습니다.

해결 방법이 있습니까?

답변

0

기본적으로 Parse Promise delays to the next tick or with timeout 0입니다.

테스트 전에 Parse.Promise.disableAPlusCompliant();을 호출하는이 동작을 해제 할 수 있습니다.

+0

이 코드의 실행 순서를 중단하고는 설명 할 수없는 실패를 얻을 수 있습니다. –

+0

원한다면 한 번만 테스트 할 수 있습니다. 몇 시간 동안 검색 한 후에 작동시킬 수있는 유일한 방법이었습니다. – gfpacheco

1

모카 실제로 약속 구문 지원을하고있다, 당신은 단지 done 매개 변수를 삭제하고 약속을 반환하여 직접 약속을 테스트 할 수 있습니다

describe('foo', function() { 
    it('gets', function() { // no `done` 
    try { 
     $httpBackend.expect('GET', '/bar').respond(200); 
     return foo().then(function(res) { // return here 
     expect(res.status).to.be.equal(200); 
     }); 
    } finally { 
     $httpBackend.flush(); 
    } 
    }); 
}); 
+0

하지만'$ http.get' 약속이 해결 되려면'$ httpBackend.flush'를 호출해야합니다. 언제 그렇게 할거야? – gfpacheco

+0

@gfpacheco 오 맞습니다. httpBackend를 조롱하고 있기 때문에 전화해야합니다. –

+0

죄송합니다. 여전히 저를 위해 일하지 않습니다. 테스트 해 봤어? – gfpacheco