我使用通过NPM安装的Jasmine 2.3
并使用Grunt执行。
'use strict';
module.exports = function(grunt) {
grunt.initConfig({
package: grunt.file.readJSON('package.json'),
exec: {
jasmine: 'node_modules/.bin/jasmine'
}
});
require('load-grunt-tasks')(grunt);
require('time-grunt')(grunt);
grunt.registerTask('default', 'exec:jasmine');
};
我导出了一个Express.js应用程序对象,并在我的规范中与SuperTest一起使用。
'use strict';
var supertest = require('supertest')
var application = require('../../../../../server');
describe('GET /api/users', function() {
it('should respond with json', function(done) {
supertest(application)
.get('/api/users')
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect(200, done);
});
});
当我运行规范时,即使预期有200
状态代码并且404
是结果,我也没有错误。是Jasmine或SuperTest中的问题,还是我应该使用SuperAgent。
我没有在Express应用程序对象上设置404
错误处理程序设置路由。
application.use(function(request, response, next) {
response
.status(404)
.send({
message: 'not found'
});
});
答案 0 :(得分:10)
首先,好问题!我已经学到了一些研究这个的东西。显然Jasmine + Supertest并不能很好地融合在一起。原因似乎是Supertest调用done(err)
,但Jasmine只会在调用done.fail()
或fail()
时失败。您可以看到一些github问题here和here。
使用此代码查看证明:
describe('GET /api/users', function() {
it('should respond with json', function(done) {
supertest(application)
.get('/api/users')
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect(200, function(res){
console.log(res);
//res is actually an error because supertest called done(error)!
done.fail() //Now jasmine will actually fail
});
});
});
鉴于此,似乎最简单的解决方案是使用可以很好地协同工作的备用库。我个人使用摩卡代替茉莉,取得了很好的成功。这是你的选择!
如果你真的想,你可以使用茉莉花并编写自己的验证器,在超级文档here中看到。
我希望这有帮助!
答案 1 :(得分:3)
测试失败的原因是Supertest调用done(err)
,而Jasmine在done.fail()
或fail()
失败。尽管如此,有一种方法可以让Jasmine和Supertest一起工作。
检查出来:
describe('GET /api/users', function() {
it('should respond with json', function(done) {
supertest(application)
.get('/api/users')
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect(200)
.end(function(err, res) {
if (err) {
done.fail(err);
} else {
done();
}
});
});
});
添加
.end(function(err, res) {
if (err) {
done.fail(err);
} else {
done();
}
});
在描述块中的所有Supertests的end
中的应解决Supertest和Jasmine之间的问题。这也将在控制台中提供一些甜蜜的错误描述。
答案 2 :(得分:2)
为了避免在每个.end()
函数中编写逻辑。我建议您在所有茉莉花规格之前使用以下代码段(或者如果您愿意,可以将其放在帮助文件helpers/tell-jasmine.js
中):
function tellJasmine(done) {
return function (err) {
if (err) {
done.fail(err);
} else {
done();
}
};
}
现在你可以在你的超级结束时写下.end(tellJasmine(done))
:
describe('GET /api/users', function () {
it('should respond with json', function (done) {
supertest(application)
.get('/api/users')
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect(200)
.end(tellJasmine(done));
});
});
此代码的信用额转到nesQuick。