【问题标题】:Code Coverage with Mocha in node.jsnode.js 中 Mocha 的代码覆盖率
【发布时间】:2012-03-05 22:47:09
【问题描述】:

简介

我安装了 jscoverage 并设置了一个 make 命令来生成 app-cov 的覆盖率数据并运行测试。

对于这个项目,我正在使用:node.js、mongoose、express、mocha 和 should。

相关文件:

生成文件:http://pastie.org/3529374

index.js:http://pastie.org/3529377

test/models/location.test.js:http://pastie.org/3529401

app/run.js:http://pastie.org/3529523

问题

输出coverage.html 文件概述为空。 0% 0 SLOC 0 个文件概览。

我的假设是 mocha 无法识别或加载 app-cov 的覆盖范围。我只为位置模型编写了一个单元测试。是我在测试中要求文件的方式吗?

我习惯了 phpunit 和它的配置,所以我在将测试套件放在一起时遇到了一些麻烦。

感谢任何可以推荐解决方案或如何整理我的丑陋代码的人:)

【问题讨论】:

  • make 命令执行没有问题,忽略双重 EXPRESS_COV=1 ,那些被放置在那里进行调试。

标签: node.js express mocha.js


【解决方案1】:

你的 makefile 有很多问题。

1- 为什么需要 TESTS 变量?你的测试在 test/ 子目录中,所以除非你有其他的 .js 文件(你为什么会这样?),那么这是 mocha 的默认值:“默认情况下 mocha(1) 将使用模式 ./test/*。 js,所以它通常是放置测试的好地方。”

2- 您的 test:test-cov: 条目都将 EXPRESS_COV 环境变量设置为 1,这意味着您无法在没有覆盖选项的情况下运行测试(也就是说,无法使用 makefile)。如果您总是想用覆盖率进行测试,这可能没问题,但是为什么有 2 个条目呢?看看express library Makefile 就是一个很好的例子。如果您遵循此示例,则您的 test: 条目不应设置 EXPRESS_COV。

3- 您的 gen-cov 条目是错误的,它实际上应该被称为 app-cov: 根据您存储检测文件的子目录的名称。顺便说一句,为什么不选择标准的“lib-cov”(和“lib”用于非仪器化的 js 文件)?当然不是必需的,但这是社区中许多人遵循的惯例。

4- 为什么在运行 jscoverage 之前删除已检测的文件?不确定它是否会导致make出现问题,不这么认为,但它没用,应该删除。

5- test-cov 现在应该依赖于 app-cov(这可能是问题的核心,make 从未检测到依赖关系已过时,因为依赖关系不存在!)。 test-cov 确实应该设置 EXPRESS_COV=1 环境变量。

6- 在 test-cov 中,coverage.html 中的“l”似乎在单独的一行,尽管它可能是 pastebin。

回顾一下(我保留了 app 和 app-cov,虽然我建议使用 lib 和 lib-cov):

REPORTER = dot
test:
    @NODE_ENV=test ./node_modules/.bin/mocha -b \
    --reporter $(REPORTER)

app-cov:
    jscoverage app app-cov

test-cov: app-cov
    @EXPRESS_COV=1 $(MAKE) test REPORTER=html-cov > docs/report/coverage.html

.PHONY: test 

编辑:我刚刚注意到,在您的测试代码中,您 require 是 /app/ 文件夹中明确的模型。您必须像在索引文件中那样使用 EXPRESS_COV 变量。

【讨论】:

  • 我正在将一个 silex 应用程序重构为一个 node.js 项目,我保持了约定。 mocha 不会递归读取我的测试,这是测试 var 的原因。多余的 EXPRESS_COV 是我在发布之前用来调试问题的东西。我只是遵循教程中的 makefile 语义。布线似乎不是问题,您指出的任何内容都没有被实现破坏,只是语义。我同意我误解了测试引导以分析覆盖率的关键点,如果您能发现它会更有帮助。
  • #3 不是语义,而是 make 的工作方式。我在您的代码中指出了许多问题,我无法神奇地知道它是用于调试的,我分析了发布的内容。我的编辑告诉您为什么看不到覆盖率,因为这是您唯一的测试,它从应用程序(而不是应用程序-cov)显式加载。即便如此,您测试一个属性是否存在,这取决于您的模型的实现,这可能不会涵盖任何代码。如果你在你的模型上调用一个方法,那么它会测试一些东西。
  • 从发布的 makefile 中,运行 make gen-cov 将产生预期的效果。我不明白你的误解。 gen-cov 不是一个目录,它是一个目标。在那个例子中,我只是没有把它设置为假的。根据设计,我有一个非常贫乏的模型,并且没有复杂的域操作。这只是一个轻量级的数据存储,因此测试属性可能是我单元测试的主要内容。毕竟,如果模型是由 mongoose 架构的,则实例化模型并测试预期属性是有意义的。
  • 所以我认为您是说我的测试应该通过 mongoose 或其他加载器加载模型,而不是使用文件路径,因为模型不是从 app-cov 加载的。
  • 看起来不错,从 mongoose 加载并包含 index.js,我有代码覆盖率的输出。感谢您指出。
猜你喜欢
  • 2013-05-14
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 2015-03-22
  • 2018-07-20
  • 2015-07-03
  • 2012-06-30
  • 2015-08-26
相关资源
最近更新 更多