如何为快速功能设置代码覆盖率和单元测试?
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 并收工,但对我来说,这将使它成为一个集成测试。真正的单元测试会让您隔离要测试的特定部分。
我有一条路线定义为
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 并收工,但对我来说,这将使它成为一个集成测试。真正的单元测试会让您隔离要测试的特定部分。