这是一个关于测试的一般性问题,但我将在 Node.js 的上下文中对其进行构建。我不太关心特定技术,但这可能很重要。
在我的应用程序中,我有几个模块会在我的网络服务器收到请求时调用它们来工作。对于其中一些模块,我会在调用它们之前关闭请求。
什么是测试这些模块是否正在执行它们应该执行的操作的好方法?
咨询here对于 RSpec 来说,就是模拟这些模块正在做的工作,并确保调用适当的方法。这对我来说很有意义,但在 Node.js 中,由于我的模块不是全局的,我认为我不能在不更改程序架构的情况下模拟函数,以便每个实例都接收它需要的对象实例1.
[1] 这是一个众所周知的编程范式,但我现在记不起它的名字了。
我看到的另一个选择是使用 setTimeout
并尽可能猜测这些模块何时完成它们的工作。
这些似乎都不理想。
我错过了什么吗?后台进程没有测试吗?
最佳答案
由于您谈到的是这些后台组件的集成测试,因此我想到了一些策略。
- 在测试模式下消除操作中的所有异步性。我在想象你有某种排队过程(这可能是一个错误的假设),你把工作扔进队列,然后你的模块拿起那个工作并完成他们的任务。您可以重新设计您的测试工具,使测试工具充当排队机制,并且您可以有效地直接控制模块何时执行。
- 重构您的模块以采用某种
next
回调函数。它们最终的功能有点像 Express 的中间件层或async
的each
函数的工作方式,但是在每个模块中你会传递一些回调,当该模块的任务完成。一旦所有模块都已报告,您就可以检查程序的状态。 - 正是您已经建议的 - 等待一段时间,如果仍未完成,则认为失败。
Mocha
有点 就是这样做的,因为如果给定的测试超过了可定义的阈值,那么它就是失败的。不过我不喜欢这种方式,因为如果您添加更多测试,它们都必须等待相同的时间。
关于node.js - 在nodejs中测试后台进程(使用磁带),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22067718/