我的路线定义为
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'
答案 0 :(得分:2)
有多种代码覆盖工具,其中很多都在不同的构建系统中集成(gulp,grunt等等)。
其中一个领先者是Istanbul,这是我个人使用的。其他受欢迎的图书馆是blankets和coveralls
要查看使用Gulp和Istanbul(以及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和here类似的问题。
但基本上你在上面的代码中提出的要求是req
的存根和res.status(403).end()
的间谍。间谍可能有点棘手,因为你基本上需要监视Express中的实际Response对象(可以围绕他们的文档谷歌查看如何获得它)。
如果您还不熟悉,我建议使用sinon,但还有其他库用于模拟/存根/间谍。
社区中似乎很多人只是使用Supertest并称之为一天,但对我而言,这将使其成为集成测试。真正的单元测试会让您隔离您尝试测试的特定部分。