是否可以将 supertest 与 hapi 一起使用?
Is it possible to use supertest with hapi?
我用的是 hapi,不是 express。超测还能用吗?
如果是这样,有没有一种快速的方法来更改我的代码以使其成为 运行?
我的测试看起来像这样,基于 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;
Estus 的回答有效。我需要导出最外层 class、app.js
中的 hapi.Server
。然后将其 listener
属性 传递给 tape
.
然后我不得不使用 tape.onFinish( () => server.stop() );
在测试结束时停止服务器。
用 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()
我用的是 hapi,不是 express。超测还能用吗?
如果是这样,有没有一种快速的方法来更改我的代码以使其成为 运行?
我的测试看起来像这样,基于 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;
Estus 的回答有效。我需要导出最外层 class、app.js
中的 hapi.Server
。然后将其 listener
属性 传递给 tape
.
然后我不得不使用 tape.onFinish( () => server.stop() );
在测试结束时停止服务器。
用 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()