Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.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 与sinon的单元测试express.js路线_Node.js_Unit Testing_Express_Sinon - Fatal编程技术网

Node.js 与sinon的单元测试express.js路线

Node.js 与sinon的单元测试express.js路线,node.js,unit-testing,express,sinon,Node.js,Unit Testing,Express,Sinon,我正在学习express和sinon(艰难之路:))。我想对以下代码进行单元测试: // ./routers/root.js var express = require('express'); var router = express.Router(); router .route('/') .get(function(req, res) { res.writeHead(200, {'Content-Type': 'application/json'}); res.

我正在学习express和sinon(艰难之路:))。我想对以下代码进行单元测试:

//  ./routers/root.js

var express = require('express');
var router = express.Router();

router
  .route('/')
  .get(function(req, res) {
    res.writeHead(200, {'Content-Type': 'application/json'});
    res.write(JSON.stringify({Application: "NodeTours", Version: "2.0.0", Host: host, Port: port}));
    res.end();
  });

module.exports = router;
我一直在尝试不同的事情,但都没有成功。我回到基本的例子。我意识到这似乎是一个完全的新手问题,但我一无所知。以下是最新的尝试:

//   ./test/test.js

var sinon = require('sinon')
var expect = require('chai').expect

describe('Routers', function() {

  context('/', function() {
    var rootRouter = require('../routers/root')
    var res = {Application: "NodeTours", Version: "2.0.0", Host: 'host', Port: 'port'};
    it('should call / router', function() {
      rootRouter.route('/').get(null, res);
      // TODO: expect...
    })
  })
})
它失败于:

  Routers
    /
      1) should call / router


  0 passing (4ms)
  1 failing

  1) Routers
       /
         should call / router:
     Error: Route.get() requires a callback function but got a [object Null]
      at Route.<computed> [as get] (node_modules/express/lib/router/route.js:202:15)
      at Context.<anonymous> (test/test.js:10:29)
      at processImmediate (internal/timers.js:456:21)

在测试用例中,您正试图直接调用GET处理程序:

it('should call / router', function() {
  rootRouter.route('/').get(null, res);
  // TODO: expect...
})
但它是一个用于安装请求处理程序的方法,而不是调用它。这就是为什么您收到的错误显示:

错误:Route.get()需要回调函数,但得到了[object] 空]

i、 例如,您正在为您认为是请求参数的对象传递
null
,但是Express期望的是方法(回调)处理程序

通常我会将处理程序定义为非匿名函数:

function rootHandler(req, res) {
    res.writeHead(200, {'Content-Type': 'application/json'});
    res.write(JSON.stringify({Application: "NodeTours", Version: "2.0.0", Host: host, Port: port}));
    res.end();
}

router
  .route('/')
  .get(rootHandler);
…然后单元测试可以直接调用函数,而不是通过Express(因为通常我们感兴趣的是测试自己的代码,而不是框架):


如果您确实想测试路由逻辑,那么按照注释中的建议使用
supertest
是一个不错的选择。

在您的测试用例中,您正试图直接调用GET处理程序:

it('should call / router', function() {
  rootRouter.route('/').get(null, res);
  // TODO: expect...
})
但它是一个用于安装请求处理程序的方法,而不是调用它。这就是为什么您收到的错误显示:

错误:Route.get()需要回调函数,但得到了[object] 空]

i、 例如,您正在为您认为是请求参数的对象传递
null
,但是Express期望的是方法(回调)处理程序

通常我会将处理程序定义为非匿名函数:

function rootHandler(req, res) {
    res.writeHead(200, {'Content-Type': 'application/json'});
    res.write(JSON.stringify({Application: "NodeTours", Version: "2.0.0", Host: host, Port: port}));
    res.end();
}

router
  .route('/')
  .get(rootHandler);
…然后单元测试可以直接调用函数,而不是通过Express(因为通常我们感兴趣的是测试自己的代码,而不是框架):


如果您真的想测试路由逻辑,那么按照注释中的建议使用
supertest
是一个不错的选择。

Idk但是如果您想轻松地测试您的Web服务器,您可以使用包来模拟服务器,发送请求并轻松地验证响应。@Mickelb。我已经成功地使用了supertest,但我相信这将被归类为集成测试,而不是单元测试。是的,你是对的。但是如果你想轻松地测试你的Web服务器,你可以使用该软件包模拟服务器,发送请求,并轻松地验证响应。@Mickelb。我已经成功地使用了supertest,但我相信这会被归类为集成测试,而不是单元测试。是的,你是对的。顺便说一句,这篇文章声称Express支持通过
应用调用回调处理程序。_router.handle
,但这似乎没有被记录下来,我也没有亲自使用过。关于处理程序的观点很好。谢谢这就是我在其他路由中所做的——我将路由器与控制器/处理器分开,例如
var express=require('express');var router=express.router();var cruisecontroller=需要(“../controllers/cruises”);router.route('/').get(cruisecontroller.cruises_get)router.route('/:id').get(cruisecontroller.cruises_get_id)module.exports=路由器
I将root.js更改为
var express=require('express');var router=express.router();函数rootHandler(req,res){res.writeHead(200,{'Content-Type':'application/json'});res.write(json.stringify({application:'NodeTours',Version:'2.0.0',Host:Host,Port:Port});res.end();}router.route('/').get(rootHandler);module.exports=路由器;})和我的test.js是:
var sinon=require('sinon')var expect=require('chai')。expect描述('router',function(){context('/',function(){var rootRouter=require('../Routers/root')var res={Application:'NodeTours',Version:'2.0.0',Host:'Host',Port:'Port');它('should call/router',function()){rootRouter.rootHandler(null,res)})
现在我得到了
路由器/1)应该调用/router 0通过(4ms)1失败1)路由器/应该调用/router:TypeError:rootRouter.rootHandler不是上下文中的函数。(test/test.js:11:18)processImmediate(内部/timers.js:456:21)
顺便说一句,这篇文章声称Express支持通过
应用程序调用回调处理程序。_router.handle
,但这似乎没有记录,我也没有亲自使用过。处理程序的要点很好。谢谢。这就是我在其他路由中所做的-我将路由器与控制器/处理程序分开,例如
var Express=requirere('express');var router=express.router();var cruisesController=require(../controllers/cruises”);router.route('/').get(cruisesController.cruises\u get)router.route('/:id').get(cruisesController.cruises\u get\u id)module.exports=router;
I将root.js改为
var express=require('express'));var router=express.router();函数rootHandler(req,res){res.writeHead(200,{'Content-Type':'application/json'});res.write(json.stringify({application:'NodeTours',Version:'2.0.0',Host:Host,Port:Port}));res end();}router.route('/').get(rootHandler);module.exports=router;})
和my test.js将是:
var sinon=require('sinon')var expect=require('chai')。expect描述('router',function(){context('/',function(){var rootRouter=require('../router/root')var res={Application:'NodeTours',Version:'2.0.0',Host:'Host',Port:'Port};它('should call call/router',function()){rootRouter.rootHandler(null,res)})
现在我得到了
路由器/1)应该调用/router 0通过(4ms)1失败1)路由器/应该调用/router:TypeError:rootRouter.rootHandler不是上下文中的函数。(test/test.js:11:18)processImmediate(internal/timers.js:456:21)