是否可以对hapi使用supertest? [英] Is it possible to use supertest with hapi?

查看:87
本文介绍了是否可以对hapi使用supertest?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是hapi,不是快递.超级测试应该仍然有效吗?

I'm using hapi, not express. Should supertest still work?

如果是这样,是否可以快速更改代码以使其运行?

If so, is there a quick way to change my code to get it to run?

我的测试基于文档:

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)
    ......
});

但是它给了我这个错误:

but it gives me this error:

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)

这是我的应用代码:

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

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;

推荐答案

Estus的答案有效.我需要在最外层的类 app.js 中导出 hapi.Server .然后将其 listener 属性传递给 tape .

Estus' answer worked. I needed to export the hapi.Server in my outermost class, app.js. Then pass its listener property to tape.

然后我必须使用 tape.onFinish(()=> server.stop()); 在测试结束时停止服务器.

And then I had to use tape.onFinish( () => server.stop() ); to stop the server at the end of my tests.

这篇关于是否可以对hapi使用supertest?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆