2017-07-12 3 views
0

Ich versuche, einige Test-Code in einem Nodejs-Projekt mit Mocha/sollte und Anfrage schreiben.Node.js & Mocha/Sollte (JavaScript, ES6): Code nicht ausgeführt, obwohl es wie es aussehen sollte

Mein Code initialisiert ein Array mit einigen Webadressen, um eine GET-Anfrage an einen entfernten Server zu senden und den Inhalt der Antworten zu überprüfen.

Mein Mock-Up muss jetzt nur die Antwort ausdrucken, aber aus irgendeinem Grund kommt der Fluss nie dorthin.

Beachten Sie, dass ich eine for-Schleife habe. Innerhalb der Schleife wird das erste Konsolenprotokoll ausgedruckt, aber aus irgendeinem Grund wird der Rest des Codes in dieser Schleife übersprungen. Ich setze Break-Punkte im Debug-Modus, aber mein Code erreicht nur die erste console.log() innerhalb der Schleife und der Anfrageteil wird übersprungen.

Ich habe versucht, auch die unpromisierte Version der Anfrage (Streams und alle) zu verwenden, aber ich bekomme das gleiche Problem - der Code erreichte nie diese Anfrage Zeile, so dass es natürlich nicht weiter zum Drucken von nichts geht.

Hat es etwas mit asynchroner Arbeit in nodejs zu tun? etwas anderes?

Was fehlt mir?

'use strict'; 
 
const Promise = require('bluebird') 
 
\t , _ = require('underscore') 
 
\t , should = require('should') 
 
\t , r = require('request') 
 
\t , request = Promise.promisifyAll(r.defaults({jar: true})) 
 
\t , client = require('../whatever/someClient') 
 
\t , testConfig = require('../config/test-config') 
 
; 
 

 
Promise.longStackTraces(); 
 

 
class someFeatureTestSet { 
 
\t 
 
\t constructor() { 
 
\t \t //... 
 
\t \t this.client = client.getUser(); 
 
\t \t //... 
 
\t } 
 
\t 
 
\t static create() { return new someFeatureTestSet(); } 
 
\t 
 
//... some other consts and functions 
 
\t 
 
\t initURLs(someUrlParamVal) { 
 
\t \t return Array 
 
\t \t .apply(null, Array(someUrlParamVal)) 
 
\t \t .map((x, idx) => 
 
\t \t \t `http://example.com/whatever?c=${someUrlParamVal}` 
 
\t \t); 
 
\t } 
 
\t 
 
\t runTests() { 
 
\t \t const client = this.client; 
 
\t \t const someFeatureTestSet = this; 
 
\t \t 
 
\t \t describe('get stuff',() => { 
 
\t \t \t 
 
\t \t \t it('should bla',() => { 
 
\t \t \t \t const productsLinks = this.initURLs('123'); 
 

 
\t \t \t \t for (let x in productsLinks) { 
 
\t \t \t \t \t console.log(productsLinks[x]); //gets printed, no problem 
 
\t \t \t \t \t request.getAsync({ uri: productsLinks[x] }) 
 
\t \t \t \t \t .then(res => { //code never gets here. why? 
 
\t \t \t \t \t \t console.log(res); //code never gets here. why? 
 
\t \t \t \t \t }) 
 
\t \t \t \t } 
 

 
\t \t \t }); 
 
\t \t \t 
 
\t \t }); 
 
\t \t 
 
\t } 
 
\t 
 
} 
 

 
module.exports = someFeatureTestSet; 
 

 
const createTestSet =() => someFeatureTestSet.create(); 
 

 
createTestSet().client().runTests();

Antwort

2

Sie müssen die done() Rückruf nach dem Ausführen asynchroner Tests ein Versprechen oder rufen Sie entweder zurück. Da Sie Asynchron-Anforderungen in einer Schleife laufen müssen Sie die Anfrage Versprechen in einem Array sammeln und Promise.all()

it('should bla',() => { 
    const productsLinks = this.initURLs('123'); 
    let requests = []; 

    for (let x in productsLinks) { 
    console.log(productsLinks[x]); //gets printed, no problem 
    requests.push(request.getAsync({ uri: productsLinks[x] })); 
    } 

    return Promise.all(requests); 
}); 

verwenden Wenn Sie done() verwenden möchten, können Sie folgendermaßen vorgehen -

it('should bla', (done) => { 
    const productsLinks = this.initURLs('123'); 
    let requests = []; 

    for (let x in productsLinks) { 
    console.log(productsLinks[x]); //gets printed, no problem 
    requests.push(request.getAsync({ uri: productsLinks[x] })); 
    } 

    Promise 
    .all(requests) 
    .then(() => { 
     done(); 
    }) 
}); 

Beachten Sie, dass Das Aufrufen von done() wird fehlschlagen, wenn es das für das Ausführen von Mokka- Tests festgelegte Zeitlimit überschreitet. Sehen Sie hier, um mehr zu lernen - https://mochajs.org/#timeouts

0

Als ich das Problem vermutete war gründlich mit Node.js Ereignisschleife und Mocha Arbeit mit Versprechen statt der älteren "fertig" Callbacks.

Die folgende Lösung für mich gearbeitet:

'use strict'; 
 
const Promise = require('bluebird') 
 
\t , _ = require('underscore') 
 
\t , should = require('should') 
 
\t , r = require('request') 
 
\t , request = Promise.promisifyAll(r.defaults({jar: true})) 
 
\t , client = require('../whatever/someClient') 
 
\t , testConfig = require('../config/test-config') 
 
; 
 

 
Promise.longStackTraces(); 
 

 
class someFeatureTestSet { 
 
\t 
 
\t constructor() { 
 
\t \t //... 
 
\t \t this.client = client.getUser(); 
 
\t \t //... 
 
\t } 
 
\t 
 
\t static create() { return new someFeatureTestSet(); } 
 
\t 
 
//... some other consts and functions 
 
\t 
 
\t initURLs(someUrlParamVal) { 
 
\t \t return Array 
 
\t \t .apply(null, Array(someUrlParamVal)) 
 
\t \t .map((x, idx) => 
 
\t \t \t `http://example.com/whatever?c=${someUrlParamVal}` 
 
\t \t); 
 
\t } 
 
\t 
 
\t runTests() { 
 
\t \t const client = this.client; 
 
\t \t const someFeatureTestSet = this; 
 
\t \t 
 
\t \t describe('get stuff',() => { 
 
\t \t \t 
 
\t \t \t it('should bla',() => { 
 
\t \t \t \t const productsLinks = this.initURLs('123'); 
 

 
\t \t \t \t return Promise.map(productsLinks, productsLink => 
 
\t \t \t \t \t return request.getAsync({uri: productsLink }) 
 
\t \t \t \t \t \t .then(res => { console.log(res) }); 
 
\t \t \t \t); 
 

 
\t \t \t }); 
 
\t \t \t 
 
\t \t }); 
 
\t \t 
 
\t } 
 
\t 
 
} 
 

 
module.exports = someFeatureTestSet; 
 

 
const createTestSet =() => someFeatureTestSet.create(); 
 

 
createTestSet().client().runTests();

Verwandte Themen