Javascript 如何从单元测试的express routes中获取函数?

Javascript 如何从单元测试的express routes中获取函数?,javascript,node.js,unit-testing,express,Javascript,Node.js,Unit Testing,Express,我有一个JS控制器,导出了一些路由。我想了解单元测试路由中使用的函数 注意,我看到很多博客提倡创建真正的http请求来单元测试express路由。在我的书中,这并不完全是单元测试。它更多的是单元测试 我希望在测试中直接调用函数,从而将(大部分)框架排除在测试之外 例如: controller.js: 在我的单元测试中,我想直接调用foo(res,res)(我将制作一些模拟req和res对象)最简单的方法是将每个函数添加到模块中。导出。这样,您就可以要求控制器进入测试并直接调用函数 // con

我有一个JS控制器,导出了一些路由。我想了解单元测试路由中使用的函数

注意,我看到很多博客提倡创建真正的http请求来单元测试express路由。在我的书中,这并不完全是单元测试。它更多的是单元测试

我希望在测试中直接调用函数,从而将(大部分)框架排除在测试之外

例如:

controller.js:


在我的单元测试中,我想直接调用
foo(res,res)
(我将制作一些模拟req和res对象)

最简单的方法是将每个函数添加到
模块中。导出
。这样,您就可以要求控制器进入测试并直接调用函数

// controller.js
module.exports = router;
module.exports._spec = {
  foo: foo,
  bar: bar
};


// controlerSpec.js
var app = require('controller');

app._spec.foo(mockReq, mockRes);

如果您想对Express routes执行未记录的操作,请查看Express源代码,看看是否可以访问存储路由的方式。它是开源的——代码对您来说都是可用的。听起来你是在要求我们为你做功课。当然,如果某些路由需要访问其他Express,比如会话和/或各种req或res方法,或者依赖中间件,那么你需要做很多模拟(基本上是重新创建Express为你做的一系列事情)。试图单独测试路由处理程序似乎是愚蠢的差事。您假设它是独立工作的,并且不是代码系统(特别是中间件)的一部分。@jfriend00不是很多模拟,至少在我的情况下是这样。可能只是头和res方法。无论如何,在其他语言中,大量模拟被认为是良好的实践,因为测试知道并测试对外部/注入对象的每个调用。就像java中的Mockito一样,每个调用和每个参数都会被考虑。我怎么做没有文档记录的事情?为什么会投反对票?用模拟代码替换实际代码(比如中间件),最终测试模拟代码,而不是真正的代码。所以,你也必须考虑测试代码,在某一点上,你必须一起测试所有的东西,以确保它们一起工作。我认为测试一个实际的HTTP请求比仅仅测试创建HTTP请求所涉及的一个函数更有意义。您当然可以测试比实际HTTP请求更小的组件,但不能跳过测试实际HTTP请求。这太完美了,谢谢。我一直忘了你可以向javascript实体添加任何你想要的东西。
// controller.js
module.exports = router;
module.exports._spec = {
  foo: foo,
  bar: bar
};


// controlerSpec.js
var app = require('controller');

app._spec.foo(mockReq, mockRes);