2013-04-15 12 views
8

Jak mogę to sprawdzić w sposób asynchroniczny?Jak przetestować kodu pośredniczącego zwracającego obietnicę w teście asynchronicznym?

it('Should test something.', function (done) { 

    var req = someRequest, 
     mock = sinon.mock(response), 
     stub = sinon.stub(someObject, 'method'); 

    // returns a promise 
    stub.withArgs('foo').returns(Q.resolve(5)); 

    mock.expects('bar').once().withArgs(200); 

    request(req, response); 

    mock.verify(); 

}); 

I tu jest metoda do testowania.

var request = function (req, response) { 

    ... 

    someObject.method(someParameter) 
     .then(function() { 
      res.send(200); 
     }) 
     .fail(function() { 
      res.send(500); 
     }); 

}; 

Jak widać używam node.js, Q (obietnicy), sinon dla wyśmianie i stubbing i mokka jako środowisku testowym. Powyższy test kończy się niepowodzeniem z powodu zachowania asynchronicznego z metody żądania i nie wiem, kiedy wywołać done() w teście.

+0

Najprostszym sposobem znalazłem się w pracy z połączeń asynchronicznych, jeśli chcą korzystać z odpowiedzi, było przełamanie funkcję w 2 w miejscu, gdzie jest potrzebny i wywołać odpowiedź druga część, w której otrzymano odpowiedź. –

+0

musisz wybrać odpowiedź, a nie tylko przegrupować. – oligofren

Odpowiedz

4

Musisz zadzwonić po zakończeniu wszystkich operacji asynchronicznych. Kiedy myślisz, że tak będzie? Jak zwykle czekałeś, aż żądanie zostanie zakończone?

it('Should test something.', function (done) { 

    var req = someRequest, 
     mock = sinon.mock(response), 
     stub = sinon.stub(someObject, 'method'); 

    // returns a promise 
    stub.withArgs('foo').returns(Q.resolve(5)); 

    mock.expects('bar').once().withArgs(200); 

    request(req, response).then(function(){ 
     mock.verify(); 
     done(); 
    }); 

}); 

Dobrym pomysłem może być oznaczenie testu jako niepowodzenia w odpowiedzi na błąd błędu dołączony do obietnicy.

+0

Metoda żądania nie jest obietnicą samą w sobie. Więc nie ma metody .then. Czekałbym na wywołanie metody response.send. Niestety metoda żądania kończy się, zanim to nastąpi. – Stefan

+1

Być może sedno tego problemu nie wyszło na dobre. Zwykle zwracam callback z someObject.method, jak np. 'Stub.withArgs ('foo'). Yields (5)'. W takim przypadku funkcja wywołania zwrotnego jest natychmiast wykonywana. Ale teraz, z obietnicami, zwracam tylko obiekt odroczony, a program obsługi rozstrzygnięć i odrzucania jest wywoływany zbyt późno, ponieważ metoda żądania już się zakończyła. W związku z tym pozorowane obiekty nie zostały zweryfikowane. Jeśli zapakuję metodę verify w metodzie setTimeout z wywołaniem, aby to zrobić, test przechodzi. 'setTimeout (function() {mock.verify(); done();}, 100)' – Stefan

+0

Hmm, z mojego doświadczenia wynika, że ​​dobrą praktyką jest, aby metody asynchroniczne zapewniały pewien sposób poznania, kiedy będą gotowe - w tym celu można albo zaakceptuj parametr wywołania zwrotnego, albo zwróć obietnicę. W zależności od używanej metody możesz wywołać kod "końca testu". –

1

rozwiązanie Praca w maszynopisie:

var returnPromise = myService.method() 
    returnPromise.done(() => { 
     mock.verify() 
    }) 
Powiązane problemy