我正在使用hapi,而不是表达。 supertest还应该工作吗?
如果是这样,是否可以通过快速方式更改我的代码以使其运行?
我的测试看起来像这样,基于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)
......
});
但它给了我这个错误:
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
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;
答案 0 :(得分:8)
用js编写的测试的最小代码示例:
'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()
})
})
})
如果"hapi": "^16"
按原样运作。
如果是"hapi": "^8.1.0"
,您需要手动运行server.start()
berfore request
答案 1 :(得分:1)
Estus&#39;回答有效。我需要在最外层的hapi.Server
中导出app.js
。然后将其listener
属性传递给tape
。
然后我必须使用tape.onFinish( () => server.stop() );
在测试结束时停止服务器。