2016-07-02 5 views
1

Ich versuche, einen Code zu testen, die vor dem Aufruf von http ein Versprechen wartet:

Code:

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

Test:

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(); 
    }); 
}); 

Fehler:

Mein Vermutung ist, dass beacuse Parse.Promise Verzögerungen die Versprechen Auflösung verzögert, und die HTTP-Anfrage wurde nicht gemacht, wenn die $httpBackend.flush aufgerufen wird.

Gibt es eine Problemumgehung dafür?

Antwort

0

Standardmäßig Parse Assurance delays to the next tick or with timeout 0.

Sie können dieses Verhalten vor dem Test unter Parse.Promise.disableAPlusCompliant(); deaktivieren.

+0

Dies wird die Reihenfolge der Ausführung des Codes brechen und Sie könnten unerklärliche Ausfälle bekommen. –

+0

Sie können es nur für einen einzelnen Test deaktivieren, wenn Sie möchten. Es war der einzige Weg, wie ich es schaffen konnte, nachdem ich stundenlang gesucht hatte. – gfpacheco

1

Mokka tatsächlich Versprechen Syntax Unterstützung hat, können Sie nur Versprechungen direkt testen, indem Sie den done Parameter fallen und der Rückkehr, das Versprechen:

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

Aber Sie müssen '$ httpBackend.flush' aufrufen, damit das Versprechen' $ http.get' aufgelöst wird. Wann wirst du das tun? – gfpacheco

+0

@gfpacheco oh richtig, Sie müssen das anrufen, da Sie httpBackend verspotten, lemme ändern, dass –

+0

Sorry, immer noch nicht für mich arbeiten. Hast du es getestet? – gfpacheco