2016-01-22 50 views
0

我有一個由Mocha測試的應用程序,我可以用我現在所擁有的功能成功運行我的測試,但我明確地在我的測試文件中設置了一個GET路線,指向/api/v1。下面是測試文件...如何導入Supertest測試路線?

API.js

var request = require('supertest'); 
var express = require('express'); 
var app = express(); 
var router = express.Router(); 

app.get('/api/v1', function (req, res, next) { 
    res.json({ 
    "Hello": "World" 
    }); 
}); 

describe('API', function() { 
    it("Says 'Hello' is 'World'", function (done) { 
    request(app) 
     .get('/api/v1') 
     .expect('Content-Type', /json/) 
     .expect(200, { 
     Hello: 'World' 
     }, done); 
    }); 
}); 

你有沒有注意到我怎麼說require()報表後app.get()?我不想在這裏這樣做。我希望能夠從我的項目的routes目錄導入我的路線。

我覺得很難相信我應該在我的測試文件中複製所有這些路線。我如何導入routes目錄中的路線以用於此測試文件?

回答

4

不需要將路由導入到測試文件中。一旦在express.Router對象上定義了路由,並且app使用路由器,則只需從主應用程序文件導出app

您將在一個單獨的文件中定義您的路由並導出路由器。 routes.js

var express = require('express'); 
var router = express.Router(); 

// Define routes 
router.get('/api/v1', function (req, res, next) { 
    res.json({ 
    "Hello": "World" 
    }); 
}); 

// Export the router. This will be used in the 'app.js' file. 

app.js

//Import the router 
var router = require('./routes'); 

// Use the router as middleware for the app. This enables the app to 
// respond to requests defined by the router. 
app.use('/', router); 

// Export the app object 
module.exports = app; 

app.spec.js

// Import the app 
var app = require('./app'); 

// Use the app object in your tests 
describe('API', function() { 
    it("Says 'Hello' is 'World'", function (done) { 
    request(app) 
     .get('/api/v1') 
     .expect('Content-Type', /json/) 
     .expect(200, { 
     Hello: 'World' 
     }, done); 
    }); 
}); 

express.Router幫助組織你的路由。這個問題在這裏得到了完美的回答:What is the difference between "express.Router" and routing using "app.get"?

+0

我的路由(在'routes'目錄下)附加到'express.Router()',所以'app.get()'和'express.Router )',我怎麼能從'express.Router()'中得到這些路由? – IIllIIll

+0

感謝您的澄清。我會更新答案。 – gnerkus

+1

基本上我使用'var app = express()'而不是'var app = require('../ app')'。這次真是萬分感謝! – IIllIIll