2013-04-01 52 views
0

我试图测试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); 
    }); 
    }); 
}); 

回答

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); 
    }); 
    }); 
}); 
相关问题