2013-04-01 85 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); 
    }); 
    }); 
}); 
相關問題