2015-07-21 3 views
5

Ich versuche, Timeouts für Service Requests zu simulieren, um das Node requestretry Modul zu testen, mit dem Sie eine maximale Anzahl an versuchten Wiederholungen und Wiederholungsverzögerungen angeben können. Um dies zu testen, muss ich Nock verwenden, um ein Timeout für die erste X-Anzahl von Anforderungen zu simulieren, und dann erfolgreich auf die gleiche Anfrage antworten. Ich weiß, dass es die Methode "socketDelay()" gibt, um die Verbindung zu verzögern, aber wie gebe ich eine erfolgreiche Antwort nach dieser ersten verzögerten Antwort an?Node.js Nock simulieren Request Timeout und nachfolgenden Erfolg

ich das habe, die auf der ersten Anforderung ein Timeout simuliert

//delays the first request's response by 1500 
nock(urlHost) 
    .post('/' + uriPath) 
    .socketDelay(1500) 
    .reply(200, 'response body'); 

aber wie kann ich es danach schneller reagieren erholt, den Dienst zu simulieren? Ich suche etwas in diese Richtung zu tun

//delays the first two request's responses by 1500 
nock(urlHost) 
    .post('/' + requestIdentifier.ttoRoutingInfo.uriPath) 
    .socketDelay(1500) 
    .reply(200, 'response body') 
    .times(2) 
    //delays the third request by only 300 
    .then 
    .socketDelay(300) 
    .reply(200, 'response body'); 

Antwort

8

Ich werde meine eigene Frage beantworten, seit ich es herausgefunden habe. Es stellt sich heraus, dass Nock für den gleichen Endpunkt Warteschlangen-Mocks erlaubt, obwohl es nirgendwo in der Dokumentation ist. Dies ist, was ich verwendet habe, um verschiedene Verzögerungszeiten in Anfragen zu simulieren. Beachten Sie die unterschiedlichen Werte für jeden Körper antworten

var nockScope = nock(urlHost) 
     .post('/' + uriPath) 
     .delayConnection(400) 
     .reply(200, 'response body1') 
     .post('/' + uriPath) 
     .delayConnection(400) 
     .reply(200, 'response body2') 
     .post('/' + uriPath) 
     .delayConnection(200) 
     .reply(200, 'response body3'); 


expect(data).to.equal('response body3'); 

Nach der Verwendung des requestretry Modul mit timeout = 300, RetryDelay = 500 und maxAttempts = 2 ist, sollte die Antwort sein, der Körper der dritten Anforderung, da die ersten zwei Mal aus. Beachten Sie, dass ich für jeden Antwortkörper einen anderen Wert verwendet habe, um sicherzustellen, dass ich tatsächlich bei den ersten beiden Zeitlimits bin. Sie können überprüfen, dass die ersten beiden Anforderungen fehlgeschlagen sind, da der Test 1800 ms dauerte. 300 ms (erstes Timeout) + 500 ms (Verzögerung) + 300 ms (zweites Timeout) + 500 ms (Verzögerung) + 200 ms (erfolgreiche Anfrage)

Verwandte Themen