如何使用Jasmine 2.3和SuperTest测试Express.js路由

时间:2015-05-13 18:50:00

标签: node.js jasmine supertest

我使用通过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'
        });
});

3 个答案:

答案 0 :(得分:10)

首先,好问题!我已经学到了一些研究这个的东西。显然Jasmine + Supertest并不能很好地融合在一起。原因似乎是Supertest调用done(err),但Jasmine只会在调用done.fail()fail()时失败。您可以看到一些github问题herehere

使用此代码查看证明:

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