使用超级testing时,将节点应用程序重置为已知状态

我经常使用supertest对我的节点应用程序写黑盒testing。 该应用程序加载数据库设备和黑盒testing运行数据库的努力。 我想重置某些testing之间的应用程序状态(所以我可以运行不同的testing组合,而不必担心特定的数据库状态)。

理想的事情是能够用另一个重新加载应用程序:

var app = require(../app.js).app; 

但是这只发生一次,当我运行摩卡(因为它应该与require调用)。 我想我可以通过在一个batch file的多个mocha调用中包装我的testing,但是我的开发人员习惯于运行npm test ,我希望他们继续这样做。

我怎么能这样做?

require函数将基本caching结果,并且不会重新运行模块。 但是您可以从caching中删除模块:

 delete require.cache[require.resolve('../app')]; 

如果这不起作用,您可以尝试重置整个caching: require.cache = {}

但是这可能会引入错误,因为通常模块的开发方式只能在整个stream程运行时执行一次。

最好的解决方法是写模块的最小全局状态,这意味着,而不是将应用程序存储为模块级别的值,然后在任何地方,我会做一个函数,build立应用程序,被调用一次,然后通过它在哪里需要。 那么你可以避免这个问题,因为你只是每次testing都调用一次该函数( 最初由loganfsmyth 编写 )。例如,节点http服务器模块就是一个很好的例子,你可以制作好几个副本而不会相互冲突。 在任何时候您都可以close服务器来closures服务器。

至于重复摩卡电话,你可以在你的npmtesting: "test" : "mocha file1 && mocha file2 && mocha file3"

在上面的答案中find了正确的答案,最好的办法是在一个函数中构build应用程序。 这个问题在这里回答:

用supertest,express和mocha咕噜地testingapi

人们也可以像上面说的那样打破摩卡的命令行,但是这样做并不理想,因为它会使报告混乱。