如何为快速功能设置代码覆盖率和单元测试?

How to set up code coverage and unit tests for express functions?

我有一条路线定义为

app.post '/v1/media', authentication.hasValidApiKey, multipart, mediaController.create, mediaController.get

我想为路由的各个组件编写测试。所以从 authentication.hasValidApiKey 开始,这是另一个文件中定义的函数:

exports.hasTokenOrApi = (req, res, next) ->
  if not req.headers.authorization
    return res.status(403).end()

  doOtherStuff...

在我的测试中,我有:

authentication = require '../src/middlewares/authentication'

describe 'Authentication Middleware', ->
  before (done) ->
    done()

  it 'should check for authentication', (done) ->
    mock_req = null
    mock_res = null
    mock_next = null

    authentication.hasTokenOrApi mock_res, mock_req, mock_next
    done()

req、res、next如何处理?以及如何将代码覆盖率设置为 运行?我正在 运行 测试:export NODE_ENV=test && ./node_modules/.bin/mocha --compilers coffee:'./node_modules/coffee-script/lib/coffee-script/register'

有多种代码覆盖工具,许多都集成在不同的构建系统中(gulp、g运行t 等)。

领先者之一是Istanbul which is what I personally use. Other popular libraries are blankets and coveralls

要查看使用 Gulp 和伊斯坦布尔(以及 mocha)的示例设置,请查看 this gist I have

基本上,您可以 运行 通过您的测试目录,通过 istanbul 和 mocha 传输每个测试文件,并在需要时生成覆盖率报告。

gulp.src(['test/**/*.js'])
    .pipe(istanbul({includeUntested: true})) // Covering files
    .pipe(istanbul.hookRequire()) // Force `require` to return covered files
    .on('finish', function () {
        gulp.src(['test/**/*.js'])
            .pipe(mocha())
            .pipe(istanbul.writeReports(
                {
                    dir: './coverage',
                    reporters: ['html', 'lcov', 'json', 'text', 'text-summary', 'cobertura']
                })) // Creating the reports after tests runned
            .on('end', cb);
    });

关于如何只测试路由(假设它在单独的文件或模块中分离),这可能有点棘手。我发布了类似的问题 here and here

但基本上你在上面的代码中要求的是 req 的存根和 res.status(403).end() 的间谍。间谍可能有点棘手,因为您基本上需要在 express 中监视实际的 Response 对象(可以 google 在他们的文档周围查看如何获取它)。

如果您还不熟悉,我建议您使用 sinon,但是 mock/stub/spies 也有其他库。

似乎社区中的许多人只是使用 Supertest 并收工,但对我来说,这将使它成为一个集成测试。真正的单元测试会让您隔离要测试的特定部分。