如何调用Koa.js应用程序实例进行unit testing

我不知道我怎么会说这可能是静态调用一个koa路由器? 如果你想从技术angular度谈论这件事,那么在这里看起来是否是我真正想要达到的目标呢?

无论如何,我正在使用koa路由器 ,我编码unit testing(不是集成testing)。 所以我不想在我的应用程序上调用.listen(),因为这个原因…它会创build一个http服务器,现在使我的testing集成testing。

相反,在我的testing中,我只是想直接调用应用程序对象实例并调用一个路线,并能够返回没有结果,并检查我没有在响应中返回结果。

你怎么能这样做? 我无法find一个例子,我已经尝试了各种各样的伪代码尝试再次koa应用程序对象。

如果你想testingkoa-router路由到的function,那么只需对该function执行一个unit testing,然后把路由离开它。

对我来说,这听起来像你有一个文件,如app.js,它包含所有的代码。 你可以做的是创build一个router.js文件,把你的路由绑定和一个services.js文件,你可以把你的应用程序逻辑。

例如,app.js可能如下所示:

 var koa = require("koa"); var app = module.exports = koa(); var router = require('./router.js'); app.use(router.unsecured.middleware()); app.listen(3000); 

而router.js可能如下所示:

 var router = require("koa-router"); var service = require("./services.js"); var unsecured = module.exports.unsecured = new router(); unsecured.post('/account/signin', service.signinUser); unsecured.post('/account/register', service.registerUser); 

而services.js可能如下所示:

 module.exports.signinUser = function*(signinDetails) { // contains your application signin logic }; module.exports.registerUser = function*(registerDetails) { // contains your application register logic }; 

所以这样你可以单独testingservices.js。 我没有看到单独testingrouter.js的任何价值,因为它是如此微不足道。 正如@Dan Pantry所示,你可以使用supertest作为集成testing的一部分来testing路由。

编辑:

所以这是一个小小的实验性testing,我正在玩弄testing路由是否正确。 我正在使用摩卡作为testing运行器和代码示例我张贴在我的原始代码。

 // standard library var assert = require("assert"); // in app objects var router = require('./router.js'); var service = require('./service.js'); describe("routing tests", function() { it("test register routing, POST", function*(done) { // arrange var unsecured = router.unsecured; var path = '/account/register'; var httpMethod = 'POST'; var expected = service.register.toString(); var actual; // act for (var i = 0; i < unsecured.stack.length; i++) { var pathMatch = unsecured.stack[i].path === path; var methodMatch = unsecured.stack[i].methods.indexOf(httpMethod) >= 0; if (pathMatch && methodMatch) { actual = unsecured.stack[i].middleware.toString(); break; } } // assert try { assert.equal(expected, actual); done(); } catch(err) { done(err); } }); }); 

这样做可能是一个更好的方法(并且为了testing多个path而采用更模块化的方式),但正如我所说的,这只是validation路由正在调用正确服务的一个基本示例。 我在做的是钻研koa-router对象,根据HTTP方法(例如POST,GET等)validation什么path绑定到什么服务代码。

如果你有你的路由和你的服务模块这个testing完全避免处理与主要koa应用程序。 虽然技术上这个testing跨越了多个单元(路由和服务代码),所以从技术上来说这是一个集成testing,但这确实意味着你不要靠近app.listen() ,这是你不想在你的试验。