2017-03-31 6 views
2

Ich begann heute mit Jasmine zu testen, was neu für mich ist. Da ich mit einem GraphQL-Server arbeite, der mit NodeJS entwickelt wurde, verwende ich jasmine-node.Jasmine-node expect nicht ausgeführt

Das folgende ist mein erstes spec ich mich schreiben, und ich dachte, es funktioniert:

const request = require('request'); 
const config = require('../sources/config'); 

const base_url = `http://localhost:${config.graphqlPort}/${config.graphqlRoute}`; 

describe("GraphQLServer.",() => { 
it("Should expect something.",() => { 
    expect(1).not.toEqual(2); 
    expect(1).toEqual(1); 
    expect(true).toBe(true); 
    expect(false).not.toBe(true); 
}); 

describe('When request is made.',() => { 
    it('Returns statuscode 200.',() => { 
     request.get(base_url, (error, response, body) => { 
      console.log('Error: ', error); 
      console.log(base_url); 
      console.log('StatusCode: ', response && response.statusCode); 
      console.log('Body:', body); 
      expect(true).toBe(true); 
      expect(true).toBe(false); 
      expect(response.statusCode).toBe(200); 
      expect(response.statusCode).toBe(400); 
      done(); 
      }); 
     }); 
    }); 
}); 

Dies ergibt folgendes Ergebnis:

.. 

Finished in 0.018 seconds 
2 tests, 4 assertions, 0 failures, 0 skipped 


Error: null 
http://localhost:8000/graphql 
StatusCode: 400 
Body: {"errors":[{"message":"Must provide query string."}]} 

Zu viel, wenn dies ist genau das, was ich erwarte, . Ich mache eine Anfrage ohne eine Abfrage-Zeichenfolge, so dass die Fehler im Text erwartet werden. Das Problem ist: die 4 nutzlos (offensichtlich) expects innerhalb it("Should expect something") funktionieren gut. Das sind die 4 assertions im Ergebnis. Die anderen 4 expect 's innerhalb it("Returns statuscode 200.") sind einfach nicht im Ergebnis (sie nicht versagen und sie nicht bestehen), aber die console.log' s sind.

Jedes Beispiel, das ich online finde, scheint genau das zu tun, was ich hier mache, aber ich schaffe es nicht, dies zur Arbeit zu bringen.

Antwort

0

Ich vergesse die genaue Syntax in Jasmine, um eine Lösung vorzuschlagen, aber ich glaube, ich kenne die Antwort: Dies ist ein klassischer Fall des Testens mit Versprechungen. Das Ergebnis kommt zurück, nachdem der Test abgeschlossen ist, so dass Ihre expect Aufrufe nicht in einem Kontext stattfinden, in dem sie den Test mehr beeinträchtigen können.

Ein Unterschied, den ich zwischen Ihrem Code und dem Jasmin-Knoten docs bemerkt ist, dass die Funktion it geben wird done als Parameter nehmen sollte, aber Sie haben () => statt (done) =>. Das könnte das Verhalten verursachen, das du siehst.

+0

Vielen Dank Kev! Ich habe diesen dummen Fehler wirklich nicht gesehen. Ich muss zugeben, dass ich erst vor ein paar Wochen mit der Entwicklung von Javascript begonnen habe, daher denke ich, dass mir die Erfahrung fehlt, solche Fehler schnell zu finden. Javascript hilft nicht gerade mit seiner Angewohnheit, keinen Fehler zu geben, ist es nicht nötig;). Aber vielen Dank! – Kenny

+0

Gern geschehen! Es ist wahr, viele JS-Kontexte ergeben die schlechteste Rückmeldung für Fehler, manchmal kann es wirklich ärgerlich sein. Freut mich zu helfen! – Kev

1

Kev ist richtig, aber die Syntax in Jasmine beinhaltet, dass Sie Ihre expect-Anweisung nach Abschluss der asynchronen Ausführung in das promise-Ergebnis setzen. Es würde ungefähr so ​​aussehen:

it ("should do a thing with promises", function(done) { 
      myObject.doAThingWithPromises('') 
       .then(function (promiseResult) { 
        expect(promiseResult).toBeDefined(); 
        done(); 
       }) 
     }); 
+0

Danke Elliot für deine Ausarbeitung :) – Kenny

+0

Also in diesem Fall 'request.get (...). Then (() => {... done()})' – Kev