2016-05-25 27 views
4

Ich benutze hapi, nicht ausdrücken. Sollte Supertest noch funktionieren?Kann Supertest mit Hapi verwendet werden?

Wenn ja, gibt es eine schnelle Möglichkeit, meinen Code zu ändern, damit er ausgeführt wird?

Mein Test sieht wie folgt aus, basierend auf der documentation:

import tape = require('tape'); 
const supertest = require('supertest'); 
const app = require('../../../../src/app'); 

tape('creates new user in database', function (assert) { 
    supertest(app) 
    .get('/ekapi/v1/signup') 
    .expect(200) 
    ...... 
}); 

aber es gibt mir diese Fehlermeldung:

dist/server/app/node_modules/supertest/lib/test.js:55 
    var addr = app.address(); 
       ^

TypeError: app.address is not a function 
    at Test.serverAddress (/home/rje/projects/ekaya/dist/server/app/node_modules/supertest/lib/test.js:55:18) 

Hier ist meine App-Code:

app.ts

import './core/externalTypes/imports'; 
import 'reflect-metadata'; 
import kernel from './core/inversify.config'; 
import {IServer} from './core/types/IServer'; 

let server = kernel.get<IServer>("IServer"); 
server.start(); 

server.ts

import _ = require('lodash'); 
import * as hapi from "hapi"; 
import { injectable, inject } from "inversify"; 
import { IServer } from "../core/types/IServer"; 
import { ISignUpRoute } from "../core/types/ISignUpRoute"; 
import { IRouteHandler } from "../core/types/IRouteHandler"; 
import { IDatabase } from "../core/types/IDatabase"; 
import { IConfig } from "../core/types/IConfig"; 
import { IValidator } from "../core/types/IValidator"; 

@injectable() 
class Server implements IServer 
{ 
    _db : IDatabase; 
    _server: hapi.Server; 
    _config: IConfig; 
    _validator: IValidator; 
    _routes: [IRouteHandler]; 

    constructor(
     @inject("IDatabase") db: IDatabase, 
     @inject("IConfig") config: IConfig, 
     @inject("IValidator") validator: IValidator, 
     @inject("ISignUpRoute") signUpRoute: ISignUpRoute) 
    { 
     this._db = db; 
     this._config = config; 
     this._validator = validator; 
     this._routes = [signUpRoute]; 
     this._server = new hapi.Server(); 
     this._server.connection({ 
      host: '0.0.0.0', 
      port: this._config.webservice_port, 
      routes: { cors: true } 
     }); 
     this.addRoutes(); 
    } 

    start() : void 
    { 
     this._server.start((err : any) => { 
      if (err) 
        throw err; 
      console.log('Hapi server running at: ', this._server.info.uri); 
     }); 
    } 

    addRoutes() : void { 
     const self = this; 
     this._routes.map(function(routeHandler : IRouteHandler) { 
      self._server.route(routeHandler.getRoute()); 
     }); 
    } 

} 

export = Server; 
+1

Superagent beschäftigt sich mit Knoten HTTP-Server ausgeführt werden. Versuchen Sie, ['server.listener'] (http://hapijs.com/api#serverlistener) zu liefern, das könnte funktionieren. – estus

+0

Aber wenn ich den Server manuell starten muss, um server.listener zum Supertest zu bekommen, dann kann ich das auch einfach manuell starten und abfragen unter https://github.com/request/request. In diesem Fall gibt es keinen Vorteil für Supertests. – Richard

+0

Ihr Code erwähnt nicht, was 'app.ts' exportiert. Wenn die Serverinstanz exportiert würde, könnten Sie möglicherweise 'superestest (app.listener)' ausführen. – estus

Antwort

0

Die Antwort von Estus hat funktioniert. Ich musste die hapi.Server in meiner äußersten Klasse, app.js exportieren. Übergeben Sie dann die listener Eigenschaft an tape.

Und dann musste ich tape.onFinish(() => server.stop()); verwenden, um den Server am Ende meiner Tests zu stoppen.

+0

Update: für jeden anderen, der Probleme mit Supertest hatte, gab ich es auf und verwendete superagent direkt, viel einfacher. Supertest scheint aufgegeben zu sein, in letzter Zeit gab es nur sehr wenige Wartungsprobleme. – Richard

6

Minimal-Codebeispiel für den Test in js geschrieben:

'use strict'; 

const Hapi = require('hapi'); 
const should = require('chai').expect 
const request = require('supertest') 


const server = new Hapi.Server(); 
server.connection({ port: 3000 }); 

server.route({ 
    method: 'GET', 
    path: '/', 
    handler: function (request, reply) { 
    reply('Hello, world!'); 
    } 
}); 

describe('server', function() { 
    it('server', function(done) { 
    request(server.listener).get('/').expect(200, function(err, resp) { 
     should(resp.text).equal('Hello, world!') 
     done() 
    }) 
    }) 
}) 

Bei "hapi": "^16" Werken wie.

Bei "hapi": "^8.1.0" müssen Sie manuell server.start() berfore Anfrage