如何使用npm脚本

时间:2017-10-23 21:39:16

标签: javascript phantomjs mocha nyc

我有一个用基本javascript编写的客户端Web应用程序,它应该在另一个应用程序中的修改后的chrome浏览器中运行。代码经过广泛重构,可在当前设置中使用,并更新为使用ES6功能。 旧版本使用Grunt进行了一些基于浏览器的mocha测试。

我现在想要将测试(并在必要时重写它们)添加到新设置并添加代码覆盖率并用npm脚本替换Grunt。

到目前为止,我设法重写了一些测试并使用以下命令运行它们:

./node_modules/babel-cli/bin/babel.js js --out-dir tmp/js --source-maps ./node_modules/babel-cli/bin/babel.js test --out-dir tmp/test --source-maps ./node_modules/mocha-phantomjs-core/mocha-phantomjs-core.js test/test-spec.html spec <some options>

这给出了测试的输出。他们都过去了。

现在我想使用nyc添加报道,但我不知道如何让它工作。 我发现mocha-phantomjs-istanbul但这似乎使用了mocha-phantomjs(已弃用)和istanbul 1.x(已弃用)。

如何为此配置添加代码覆盖率?

1 个答案:

答案 0 :(得分:0)

我没有太多与伊斯坦布尔和纽约的经验,但不久前我设法找到了一个工作环境,看起来像这样: 在我的Package.json中,我定义了几个脚本。覆盖范围如下:

scripts : {
    "test:c": "set NODE_ENV=test&& npm run coverage",
    "coverage": "./node_modules/.bin/nyc --reporter=lcov --reporter=text mocha test/*.* --compilers js:babel-core/register --recursive"
}

我启动测试:c脚本设置NODE_ENV变量,然后运行coverage脚本。所有测试都在测试目录中。 &#34; - 编译器js:babel-core / register&#34;标志就在那里所以代码从es6转换成直接的。您似乎已经通过前两个脚本执行此操作,因此您可以跳过该部分。

顺便说一句,这是在Windows上。如果我在unix系统上记得正确,你可以用这种方式直接设置NODE_ENV&#34; NODE_ENV = test&#34;。此外,如果你进行类似的设置,请注意这样的空白&#34;设置NODE_ENV = test&amp;&amp; npm运行另一个脚本&#34;因为这会将NODE_ENV设置为&#34; test&#34;而不是&#34;测试&#34;并且不会因此不使用插件。

我使用以下依赖项:

"mocha": "3.2.0",
"nyc": "^11.0.2",
"babel-plugin-istanbul": "^4.1.4",

这里也是我的.babelrc配置:

{
  "presets": [
    ["es2015", { "modules": false }],
    "stage-0",
    "airbnb"
  ],
  "env": {
    "test": {
      "plugins": [
        ["istanbul", {
          "exclude": [
            "**/*.spec.js",
            "webpack.config.js"
          ]
        }]
      ]
    }
  }
}

重要的部分可能是istanbul插件的配置,当NODE_ENV设置为测试时使用。 这个与nyc相关的配置是我的package.json:

的一部分
  "nyc": {
    "include": [
      "src/**/*.js"
    ],
    "exclude": [
      "shared/src/**/*.js"
    ],
    "require": [
      "babel-core/register"
    ],
    "sourceMap": false,
    "instrument": false
  },

无论如何,为了方便起见,在包json中编写单独的脚本然后通过另一个脚本将它们串在一起就好了,这样就可以这样调用它们:

"script3" :   "npm run script1 && npm run script2"