1

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

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

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

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

我怎么能这样做?

4

2 回答 2

3

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

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

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

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

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

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

于 2014-05-29T16:39:13.737 回答
1

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

使用 supertest、express 和 mocha 进行 grunt 测试 api

也可以像最后所说的那样破坏 mocha 命令行,但由于它弄乱了报告,因此并不理想。

于 2015-01-14T19:04:13.017 回答