2016-08-17 119 views
1

我是新来测试驱动开发,我想测试我的登录API,但我似乎无法完全理解如何实现与数据库测试的,哪些是做的正确方法如何测试登录API的NodeJS ?采用摩卡和柴

+0

你在用什么框架? – winter

+0

我正在使用express和sequelize(CLI)作为ORM。 –

+0

哎呀,对不清楚的问题抱歉。我的意思是,你使用的是什么样的web框架? – winter

回答

3

首先,我也没有这个主题的专家,但我一直在使用这种方法相当长的一段时间。如果有人发现我写的内容有误或有些误导,请纠正我。我对评论家和意见非常开放。

,顾名思义,TDD方法需要您实施之前编写测试。基本上,你写测试,看它失败,写实现并重复,直到测试通过。

如果使用的是快递,你可能想使用supertest模块。他们使用它的方式与superagent类似。您可以通过运行

npm install supertest --save-dev 

我将告诉你如何与摩卡和薛宝钗使用一个非常简单的例子安装。

所以这里的快递应用的一个例子:

// file: app.js 
const express = require('express'); 
const app = express(); 

// your middlewares setup goes here 

const server = app.listen(8000,() => { 
    console.log('Server is listening on port 8000'); 
}); 

module.exports = app; 

而这里的登录API的例子测试用例:

// file: test/api.js 
const request = require('supertest'); 
const app = require('../app'); 
const expect = require('chai').expect; 

describe('Login API', function() { 
    it('Should success if credential is valid', function(done) { 
     request(app) 
      .post('/api/v1/login') 
      .set('Accept', 'application/json') 
      .set('Content-Type', 'application/json') 
      .send({ username: 'username', password: 'password' }) 
      .expect(200) 
      .expect('Content-Type', /json/) 
      .expect(function(response) { 
       expect(response.body).not.to.be.empty; 
       expect(response.body).to.be.an('object'); 
      }) 
      .end(done); 
    }); 
}); 

您可以使用此命令

node_modules/mocha/bin/mocha test/**/*.js 
运行

上面的示例假定您将使用POST方法在/ api/v1/login路径上实现登录API。它还假定您将接收并以json格式回复数据。

的例子测试用例做些什么,它试图发送一个POST请求/ API/V1 /数据如下登录:

{ 
    username: 'username', 
    password: 'password' 
} 

然后,它希望你的API将与200响应代码响应如下图所示:

.expect(200) 

如果接收到的代码为200以外的代码,则测试将失败。

然后,期待您回应的Content-Typeapplication/json。如果期望不符合现实,测试也将失败。

这下面的代码:

.expect(function(response) { 
    expect(response.body).not.to.be.empty; 
    expect(response.body).to.be.an('object'); 
}) 

它会检查您的服务器的响应。如上所示,您可以在函数体内使用chai的expect。您可能会注意到supertest也提供了expect方法。但是,同时使用supertest期望和chai期望的方式是不同的。

最后,调用end函数与done回调,以便测试用例可以正常运行。

您可能要检查supertest文档,以获取有关如何使用它的更多细节。

建立数据库连接测试

之前,如果你需要保持运行的所有测试用例之前数据库连接,这里的想法:

创建test目录内的另一个文件。例如,database_helper.js。然后,写下面的代码:

before(function(done) { 
    // write database connection code here 
    // call done when the connection is established 
}); 

我已经尝试过与猫鼬之前,它为我工作。

我希望有帮助。

+1

增加一些想法:我ususally在每次测试之前用特定数据初始化数据库。你可以使用'''beforeEach(function(done){});'''。 –

+0

我正面临以下错误https://scontent-sit4-1.xx.fbcdn.net/v/t34.0-12/17821101_1469610449726804_1117021897_n.png?oh=0faa94eb2e5a915d27ab03017eda40e2&oe=58EADD80 –

+0

@RizwanPatel我无法打开链接,但我编辑了答案。我没有注意到这个错误,谢谢! – winter