2016-06-20 9 views
0

Code läuft Ich verwende Mocha und Supertest, um einen REST-Service zu testen. In diesem Fall muss ich testen, dass eine nachfolgende Anmeldung nach einer GET-Anfrage die Abfrage von dieser GET-Anfrage zurückgibt.Code von beforeJe nach dem 'It'spec

  1. Login Benutzer
  2. führen auf Endpoint-GET-Anforderung (en) params
  3. Login Benutzer verwenden und erwarten params von GET-Anforderung als Antwort.

Da der obige Test mehrmals für verschiedene Endpunkte ausgeführt werden wird, ist das, was ich mit gekommen sind, nach oben:

/* 
* getRequest.js 
*/ 
'use strict'; 

var request = require('supertest') 
    , verifyUrl = require('./verifyUrl') // verifies basic url formatting 
    ; 

module.exports = getRequest; 

/** 
* Perform GET request using given parameters and call next when finished. 
* @param getEnvironment {json} 
* @param getEnvironment.url {string} 
* @param getEnvironment.endPoint {string} 
* @param getEnvironment.authorization {string} 
* @param next {function} The callback 
*/ 
function(getEnvironment, getParams, next) { 
    var url = verifyUrl(getEnvironment.url); 
    request(url) 
     .get(getEnvironment.endPoint) 
     .set("authorization", getEnvironment.authorization) 
     .set('Accept', 'application/json') 
     .query(getParams) 
     .end(next) 
} 

/* 
* loginWithCallback.js 
* 
* Performs a basic login but depends on the callback to test the results of the login. 
*/ 
'use strict'; 

var request = require('supertest') 
    , VerifyUrl = require('./VerifyUrl') 
    ; 

module.exports = LoginWithCallback; 

/** 
* Perform basic login, then call next passing in err and res for testing. 
* 
* @param setEnvironment {json} Expects url and authorization. Any other parameters will be ignored. 
* @param setEnvironment.url {string} The url being tested. 
* @param setEnvironment.authorization {string} 
* @param next {function} callback function that will perform the actual test. 
*/ 
function LoginWithCallback(setEnvironment, next) { 

    var url = VerifyUrl(setEnvironment.url); 

    request(url) 
     .post('api/users/login') 
     .set('authorization', setEnvironment.authorization) 
     .set('Accept', 'application/json') 
     .end(next); 
} 

/* 
* e2eTest.js 
*/ 
'use strict'; 

var base64_encode = require('Base64').btoa 
    , should = require('should') 
    , jsonValidator = require('is-my-json-valid') 
    , mergeJSON = require('lodash/merge') 
    , lodashClone = require('lodash/clone') 
    , responseSchema = require('./responseSchemas/200.json') 
    , login = require('./loginWithCallback') 
    , getRequest = require('./getRequest') 
    ; 

var username = "newUser" + Date.now() 
    , password = "passW0rd" 
    , testEnvironment = { 
     "url": "http://localhost:9000/", 
     "endPoint": "api/users/login", 
     "authorization": "Basic " + base64_encode(username + ":" + password) 
    } 
    ; 

var expectedResult = {}; 

describe('End to End testing on' + JSON.stringify(testEnvironment), function() { 
    describe('new user, ' + username + ', login', function() { 
     it('should return 200 and an empty body message.', function (done) { 
      login(testEnvironment, function (err, res) { 
       if (err) { 
        done(err); 
       } 

       res.statusCode.should.deepEqual(200); 

       var jsonValidate = jsonValidator(responseSchema, {verbose: true}); 
       jsonValidate(res.body).should.be.true("Response body failed schema check: \n" + 
        JSON.stringify(jsonValidate.errors, null, 4)); 

       res.body.should.deepEqual(expectedResult); 

       done(); 
      }); 
     }); 
    }); 


    describe('user, ' + username + ', logs in after performing get request', function() { 
     var getRequestParams = {"firstName":"john", "lastName":"doe"}; 

     beforeEach(function() { 
      var getEnviron = lodashClone(testEnvironment); 
      getEnviron.endPoint = 'api/persons/findName'; 
      mergeJSON(expectedResult, {"persons": {"findName": getRequestParams}}); 
      getRequest(getEnviron, getReqestParams, function(err, res) { 
       if (err) { 
        done(err); 
       } 
       console.log("GET request: " JSON.stringify(res, null, 2)); 
       done(); 
      }); 
     }); 

     it('should return 200 and query values', function(done) { 
      login(testEnvironment, function (err, res) { 
      if (err) { 
       done(err) 
      } 

      console.log("it test: " + JSON.stringify(res, null, 2)); 

      res.statusCode.should.deepEqual(200); 

      var jsonValidate = jsonValidator(responseSchema, {verbose: true}); 
      jsonValidate(res.body).should.be.true("Response body failed schema check: \n" + JSON.stringify(jsonValidate.errors, null, 4)); 

      res.body.should.deepEqual(expectedResult); 

      done(); 

     }); 
    }); 
}); 

Was Die obigen drei Dateien sollen Folgendes tun: 1. Erstellen Sie ein neues us er 2. Melden Sie sich als neuer Benutzer an und testen Sie die Antwort auf keine vorherigen Abfrageparameter. (Durchgänge) 3. Führen Sie die GET-Anforderung aus und drucken Sie das Ergebnis dann in den Vorher-Block. 4. führen Sie die Anmeldung der Benutzerdruck- und Testergebnisse im it-Block durch.

Aber was ich bekomme ist so etwas wie:

End to End testing on{"url":"http://localhost:9000/","endPoint":"api/users/login","authorization":"Basic bmV3VXNlcjE0NjY0NDI0OTEzNDc6cGFzc1cwcmQ="} 
    new user, newUser1466442491347, login 
    ✓ should return 200 and an empty body message. (54ms) 

    user, newUser1466442491347, logs in after performing persons/findByName request 
it test: [res text] 
    1) should return and query values 
GET request: [res text] 

1 passing 
1 failing 

    Uncaught AssertionError: expected Object {} to equal Object { 
    persons: Object { findByName: Object { firstName: 'joe', lastName: 'jones' } } 
} 

Wie man sehen kann, die ‚es‘ Block ausgeführt wird, erscheint vor dem vor dem Block beendet ist. Aus meiner Lektüre von Mokka sollte dies nicht geschehen, da es auf das Vorher und Nachher wartet, bevor der 'it'-Block ausgeführt wird. Aber vielleicht wird der Callback für die getRequest in die Warteschlange gestellt, nachdem der it-Block?

Was mache ich falsch oder falsch?

Antwort

1

Sie auf jeden Fall muss stellen Sie Ihren beforeEach Haken, so dass Mocha weiß es asynchron ist: Entweder Sie geben ein Versprechen an Mokka oder verwenden Sie die done Rückruf. Um die done Rückruf zu verwenden, müssen Sie einen Rückruf deklarieren, die done nimmt:

beforeEach(function (done) { 

(Sie es, was Sie wollen (zB finished), solange Sie konsistent sind (Call finished() später) nennen könnte.)

+0

War der letzte Codeblock in meiner Frage nicht ausreichend? 'getRequest (getEnvironment, getRequestParams, function (err, res)) {done();});' Allerdings erkannte ich, dass ich irr richtigerweise nicht richtig handhabe, und änderte es wie folgt (was 'res' ausschließt, da ich es nicht tue) benutze es): 'getRequest (getEnvironment, getRequestParams, Funktion (err) {if (err) {done (err);} done();});' (oder siehe Bearbeiten in der obigen Frage) – Machtyn

+0

@Machtyn No Es war nicht ausreichend. Zum einen haben Sie, wie Sie selbst hier betonen, nicht mit 'err' gehandelt. Es kann sehr gut der Fall sein, dass sobald die Dinge in der richtigen Reihenfolge ausgeführt werden, ein Fehler aufgedeckt wird. Nun, ich habe genug Fragen über Mocha beantwortet, um zu wissen, dass einige Leute * wirklich * verwirrt darüber sind, wo 'erledigt' erklärt werden sollte, was Sie in Ihrer Frage nicht gezeigt haben. (Nein, wirklich: einige Leute vergessen, es zu deklarieren oder es an der falschen Stelle zu deklarieren.) Außerdem ist es unsicher, 'mergeJSON' nach' getRequest' zu haben. Unklar, ob das hier ein Faktor wäre, aber trotzdem. – Louis

+0

Ich werde diese Antwort gerne löschen, sobald Sie Ihre Frage bearbeitet haben, damit sie zeigt, was sie an erster Stelle hätte zeigen sollen. Wie gesagt, Sie müssen Mocha sagen, dass Ihr Haken asynchron ist. Also ist der Code, den du anfänglich für deinen Hook (ohne 'done') anzeigst, einfach falsch. Es macht keinen Sinn, es auch nur zu zeigen, weil Sie eine bessere Version Ihres Codes haben: die Version, die 'done' verwendet. Sie sollten die Frage bearbeiten, um genau den Hook anzuzeigen, den Sie mit 'done' ausgeführt haben, und erklären, welches Verhalten Sie * erhalten, wenn Sie diesen Code * ausführen. – Louis

Verwandte Themen