【问题标题】:Gruntfile to run app and mock test from single grunt commandGruntfile 从单个 grunt 命令运行应用程序和模拟测试
【发布时间】:2014-10-03 22:09:44
【问题描述】:

我有一个可以运行的 Node.js Express REST API 应用程序。很好。

我有一个 Mocha/Chai/Supertest 模拟来测试上面的 API 应用程序。很好。

但我必须启动应用程序,然后独立运行模拟测试。

如何运行单个 grunt 命令来启动 API 应用程序,让它启动并运行,然后运行模拟测试?

或者我是否需要以某种测试模式(通过 env var)运行 API 应用程序并让仅测试逻辑以某种方式调用模拟测试?

我可以尝试一些事情并得到一些工作,但什么是好方法? (避免过度使用短语“最佳实践”。)

【问题讨论】:

  • grunt concurrent 可能对此有所帮助。我用它同时运行 nodemon 和 watch。
  • 谢谢凯文,我会研究 grunt concurrent。我还在考虑在两个单独的 Docker 容器(基于相同的 Docker 映像)中运行 API 和模拟测试,并在 Docker 容器启动时执行参数化的模拟测试。然后我可以使用 Docker fig 运行这两个容器。听起来有点复杂,但它会是一个有用的模式以供将来使用。

标签: node.js gruntjs mocha.js chai supertest


【解决方案1】:

您可以使用 grunt-express-server 和 grunt-mocha-test 来做到这一点,您只需像下面这样设置您的任务:

grunt.registerTask('test', ['express:test', 'mochaTest']);

这将使用您为测试环境设置的配置运行您的 express 服务器,然后在您运行 grunt test 时运行 mocha。

由于您使用的是 supertest,我想您正在进行功能测试,这意味着您将使用相同的数据库进行开发和测试(如果您没有模拟某些东西)。这可能会浪费时间并使您的测试因数据错误而失败。使用两种不同的环境可以确保您在运行测试时的数据状态。

如果您不想手动执行此操作,您仍然可以使用 grunt watch 插件重新启动文件更改测试。

希望对你有帮助

【讨论】:

  • 感谢 Fougere,这看起来很有希望。我将在下周初尝试并跟进。我想知道是否存在 mochaTest 可以在 express 应用程序完全初始化并监听请求之前尝试访问它的竞争条件?
  • 如果你使用并发,你可能会有这种行为,如果你这样做,请检查插件的配置。 Grunt 会一一启动任务,因此您可以确定当 grunt 运行测试时,您的服务器已经启动并正在运行。这就是为什么一些聪明人同时创建插件,以完成一些独立的任务,而 grunt 正在执行其他一些任务。
  • 使用 grunt-express-server 和 grunt-mocha-test 效果很好。做我需要的。它预计启动竞争条件问题,并支持可以正则表达式匹配的“选项输出”字符串,因此在 API 应用程序发出表示“API 就绪”的预期字符串之前,模拟测试不会开始。它还会在模拟测试完成后终止 API 应用程序。完美。
猜你喜欢
  • 2016-02-19
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
相关资源
最近更新 更多