测试包含异步调用的函数

时间:2013-04-01 20:45:30

标签: node.js asynchronous express mocha sequelize.js

我正在尝试测试get函数:

exports.get = function(req, res) {
  Subscriptions
    .find(req.params.id)
    .success(function(subscription) {
      if (subscription) {
        res.json({message: "Success"}, 200);
      } else {
        res.json({message: "Not found"}, 404);
      }
    })
    .error(function(error) {
        res.json({message: "Internal server error"}, 500);
    });
};

具体来说,我并不关心它是否会访问数据库,我只想测试成功和错误事件发生的场景。我正在使用sequelize.js作为我的orm来处理数据库。我已经进行了测试并运行,但它有点讨厌,超时。有没有更好的方法呢?这是我到目前为止所做的测试:

var express = require('express')
  , sinon = require('sinon')
  , subscription = require('app/controllers/subscriptions')
  , Subscriptions = require('app/models/subscriptions')
  ;

describe('subscription controller', function() {
  beforeEach(function() {
    this.mockResponse = sinon.mock(express.response);
  });

  afterEach(function() {
    this.mockResponse.restore();
  });

  describe('GET /subscriptions/:id', function() {
    it('should return a json response', function(done) {
      var request = {
        params: {
          id: 'identifier'
        }
      };

      var expectedResponse = {
        subscriptions_uri : "/subscription/identifier"
      };

      this.mockResponse
        .expects('json')
        .once()
        .withArgs(expectedResponse);

      subscription.get(request, express.response);
      setTimeout(function() {
        done();
      }, 500);
    });
  });
});

1 个答案:

答案 0 :(得分:0)

我决定使用supertest库,这使我的控制器非常容易测试:

var express = require('express')
  , subscription = require('app/controllers/subscriptions')
  , request = require('supertest')
  , app = express()
  ;

describe('subscription controller', function() {
  describe('GET /subscriptions/:id', function() {
    it('should return a json response', function(done) {
      var expectedBody = {
        subscriptions_uri : "/subscription/identifier"
      };

      request(app)
        .get('/subscriptions/identifier')
        .set('Accept', 'application/json')
        .expect('Content-Type', /json/)
        .expect(expectedBody)
        .expect(200, done);
    });
  });
});