【问题标题】:Testing background processes in nodejs (using tape)在 nodejs 中测试后台进程(使用磁带)
【发布时间】:2014-02-27 11:52:33
【问题描述】:

这是一个关于测试的一般问题,但我将在 Node.js 的上下文中构建它。我不太关心特定的技术,但它可能很重要。

在我的应用程序中,当我的 Web 服务器接收到请求时,我有几个模块被调用来工作。对于其中一些模块,我会在调用它们之前关闭请求。

有什么好的方法可以测试这些模块是否在做它们应该做的事情?

RSpec 的建议here 是模拟这些模块正在做的工作,并确保调用了适当的方法。这对我来说很有意义,但是在 Node.js 中,由于我的模块不是全局的,我认为我不能在不更改程序架构的情况下模拟函数,以便每个实例都接收它需要的对象实例1.

[1] 这是一个众所周知的编程范式,但我现在不记得它的名字了。

我看到的另一个选项是使用setTimeout 并最好猜测这些模块何时完成它们的工作。

这些似乎都不理想。

我错过了什么吗?后台进程没有测试吗?

【问题讨论】:

  • 您是否尝试过单独测试这些模块?例如,您是否尝试过为每个单独的模块编写测试,而不是测试整个集成系统,模拟它们从主流程中得到的东西?每当我执行后台进程时,该进程都会有一些对象或对象集合。这些可以独立地执行,无论它们是否在后台进程中。
  • 是的,我对模块进行了单元测试,它们可以独立执行。对这些进行集成测试是不是很正常?

标签: node.js testing tdd


【解决方案1】:

既然您说的是这些后台组件的集成测试,我想到了一些策略。

  1. 在测试模式下将所有异步操作排除在外。我在想象你有某种排队过程(这可能是一个错误的假设),你把工作扔进队列,然后你的模块拿起那个工作并完成他们的任务。您可以重新设计测试工具,使测试工具作为排队机制,您可以有效地直接控制模块何时执行。
  2. 重构您的模块以采用某种next 回调函数。它们最终的功能有点像 Express 的中间件层或 asynceach 函数的工作方式,但是在每个模块中,您将传递一些回调,当该模块的任务完成时调用该回调。在所有模块都报告完毕后,您就可以检查程序的状态了。
  3. 完全按照您的建议 - 等待一段时间,如果仍未完成,则认为这是失败。 Mocha 有点 这样做,因为如果给定的测试超过了可定义的阈值,那么它就是失败的。不过我不喜欢这种方式,因为如果您添加更多测试,它们都必须等待相同的时间。

【讨论】:

    猜你喜欢
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-26
    • 1970-01-01
    相关资源
    最近更新 更多