使用supertest进行测试时,将节点应用程序重置为已知状态

时间:2014-05-29 16:06:47

标签: node.js integration-testing mocha supertest

我经常使用supertest针对我的节点应用程序编写黑盒测试。该应用程序加载数据库夹具,黑盒测试强烈地运行数据库。我想在某些测试之间重置应用程序状态(这样我就可以运行不同的测试组合,而不必担心特定的数据库状态)。

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

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

但是这只会在我运行mocha时发生一次(因为它应该是require次调用)。我想我可以通过从批处理文件中包含多个mocha调用中的测试来完成它,但我的开发人员习惯于运行npm test,我希望他们继续这样做。

我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

修复的最佳方法是编写具有最小全局状态的模块,这意味着不是将应用程序存储为模块级值,然后在任何地方需要它,我会创建一个构建应用程序的函数并调用一次然后将它传递到需要的地方。然后你就避免了这个问题,因为你只需要每次测试一次调用该函数(originally written loganfsmyth)例如节点http服务器模块是一个很好的例子,你可以制作它的几个副本而不会相互冲突。您可以随时close服务器将其关闭。

至于重复mocha调用,您可以在npm测试中使用它:"test" : "mocha file1 && mocha file2 && mocha file3"

答案 1 :(得分:1)

正确的答案可以在上面的答案中找到,最好的办法是在一个函数中构建应用程序。这个问题在这里得到解答:

grunt testing api with supertest, express and mocha

也可以打破mocha命令行,因为它说到最后,但是因为它弄乱了报告,所以不是那么理想。