Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何为单元测试调用KoA.js应用程序实例 我不知道我怎么称呼这个“静态呼叫到膝关节炎路由器”?如果你从技术上讲,这似乎是我真正想要实现的目标的正确措辞吗_Node.js_Koa - Fatal编程技术网

Node.js 如何为单元测试调用KoA.js应用程序实例 我不知道我怎么称呼这个“静态呼叫到膝关节炎路由器”?如果你从技术上讲,这似乎是我真正想要实现的目标的正确措辞吗

Node.js 如何为单元测试调用KoA.js应用程序实例 我不知道我怎么称呼这个“静态呼叫到膝关节炎路由器”?如果你从技术上讲,这似乎是我真正想要实现的目标的正确措辞吗,node.js,koa,Node.js,Koa,不管怎么说,我使用的是单元测试,我正在编写单元测试(不是集成测试)。所以我不想在膝关节炎应用程序上调用.ListNe()因为这个原因…它会创建一个HTTP服务器,现在我的测试是一个集成测试。 相反,在我的测试中,我只想直接调用app对象实例并调用route,这样就可以不返回任何结果,并检查我在响应中是否没有返回任何结果 你怎么能做到?膝关节炎膝关节炎的应用程序,我尝试了各种伪代码尝试。 如果您想测试KOA路由器路由的功能,那么只需对该函数执行单元测试,并将路由排除出去。 对我来说,听起来你有一个

不管怎么说,我使用的是单元测试,我正在编写单元测试(不是集成测试)。所以我不想在膝关节炎应用程序上调用.ListNe()因为这个原因…它会创建一个HTTP服务器,现在我的测试是一个集成测试。 相反,在我的测试中,我只想直接调用app对象实例并调用route,这样就可以不返回任何结果,并检查我在响应中是否没有返回任何结果


你怎么能做到?膝关节炎膝关节炎的应用程序,我尝试了各种伪代码尝试。

如果您想测试KOA路由器路由的功能,那么只需对该函数执行单元测试,并将路由排除出去。 对我来说,听起来你有一个像app.js这样的文件,它包含了你所有的代码。您可以创建一个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);
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);
module.exports.signinUser  = function*(signinDetails) {
  // contains your application signin logic
};

module.exports.registerUser  = function*(registerDetails) {
  // contains your application register logic
};
而router.js可能看起来像:

var koa = require("koa");
var app = module.exports = koa();
var router = require('./router.js');

app.use(router.unsecured.middleware());

app.listen(3000);
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);
module.exports.signinUser  = function*(signinDetails) {
  // contains your application signin logic
};

module.exports.registerUser  = function*(registerDetails) {
  // contains your application register logic
};
而services.js可能看起来像:

var koa = require("koa");
var app = module.exports = koa();
var router = require('./router.js');

app.use(router.unsecured.middleware());

app.listen(3000);
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);
module.exports.signinUser  = function*(signinDetails) {
  // contains your application signin logic
};

module.exports.registerUser  = function*(registerDetails) {
  // contains your application register logic
};
因此,通过这种方式,您可以单独测试services.js。我认为单独测试router.js没有任何价值,因为它太微不足道了。正如@Dan Pantry所示,您可以使用supertest作为集成测试的一部分来测试路由

编辑:

所以这是一个小的实验测试,我一直在玩,以测试路由是正确的。我使用mocha作为测试运行程序,并在我的原始代码中发布了代码示例

// 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);
    }
  });    
});
//标准库
var assert=要求(“assert”);
//应用内对象
var router=require('./router.js');
var service=require('./service.js');
描述(“路由测试”,函数(){
它(“测试寄存器路由,POST”,函数*(完成){
//安排
var unsecured=router.unsecured;
变量路径='/account/register';
var httpMethod='POST';
var expected=service.register.toString();
实际风险值;
//表演
对于(var i=0;i=0;
if(路径匹配和方法匹配)
{
actual=unsecured.stack[i]。middleware.toString();
打破
}
}
//断言
试一试{
断言。相等(预期、实际);
完成();
}捕捉(错误){
完成(错误);
}
});    
});
可能有一种更简洁的方法来实现这一点(以及测试多条路径的更模块化的方法),但正如我所说的,这只是验证路由是否调用了正确服务的一个基本示例。我所做的是深入研究koa路由器对象,根据HTTP方法(例如POST、GET等),验证什么路径绑定到什么服务代码


<>如果你有你的路由和服务,模块测试完全避免了主要的膝关节炎应用程序。虽然从技术上讲,此测试跨越多个单元(路由和服务代码),因此从技术上讲,它将是一个集成测试,但它确实意味着您不会接近
app.listen()
,这是您在测试中不希望调用的。

针对应用程序本身的测试是一个集成测试。您想测试应用程序本身(集成)还是单个中间件(单元测试)?否。我正在测试API的接口(合同)。我通过膝关节炎暴露了REST端点。这意味着我TDD了这些端点,所以我的TDD是非集成的。它们是单元测试,不应该通过app.Listen()进行测试。我只是在测试实际的代码,SUT,不,我不是在测试Koa的框架。您使用一个框架,但您测试域逻辑或其他任何东西。我的域逻辑包括路由。因为如果开发人员破坏了一条路线,他们就破坏了BDD测试和业务需求。这就是我开发代码的方式。这里的术语混淆了。如果您正在测试路由,即测试
GET/
,那么您必须将应用程序的该部分作为一个整体进行测试,这使得它成为一个集成测试。如果您正在测试单个函数(您不是),那么您就是单元测试。膝关节炎膝关节炎,您不想测试连接您的应用程序与KOA(应该非常薄,BTW)的层,您只想集成测试位。“创建并返回HTTP服务器”-直接从KOA文档。对于app.listen()。我并没有测试所有单独的函数,TDD'ers发现您可以过度测试此路由。使用单元测试和集成测试测试测试边界,并从边界(例如,您的单元,其中单元可以是服务合同)进行试驾,从而将代码向下推到TDD。时代变了,人们不再使用传统的TDD,您可以为每个函数创建大量的测试。测试过于耦合,最终导致测试中断,你只需要测试边界单元和代码单元。是的,这就是我将其分离的方式……但你有你的应用。在app.js中倾听,这是一个巨大的差异,好东西。测试路由器的原因是一些愚蠢的程序员可能会破坏它。他们可能会删除一条路由,他们可能会弄乱js,我们最终会得到一个空路由器,所以我认为测试该单元很重要。检查我的编辑,寻找一种潜在的方法,既可以避免您担心的问题,又可以避免supertest方法。如果没有app.listen,它将无法工作,这将使我的测试集成测试。我不想有HTTP服务器的实例,我想测试膝关节炎中间件本身,并直接调用App实例方法。