Javascript 使用Mocha和Express Rest API进行单元测试

Javascript 使用Mocha和Express Rest API进行单元测试,javascript,node.js,express,mocha.js,tdd,Javascript,Node.js,Express,Mocha.js,Tdd,我正在学习单元测试。到目前为止,我能够运行简单的测试,比如“添加两个数字并测试它们是否高于0”,但我想使用TDD构建一个RESTAPI。到目前为止,我有: 我的routes/index.js文件: var express = require('express'); var router = express.Router(); /* GET home page. */ router.get('/', function (req, res, next) { res.send({val: t

我正在学习单元测试。到目前为止,我能够运行简单的测试,比如“添加两个数字并测试它们是否高于0”,但我想使用TDD构建一个RESTAPI。到目前为止,我有:

我的
routes/index.js
文件:

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

/* GET home page. */
router.get('/', function (req, res, next) {
    res.send({val: true});
});

module.exports = router;
var mocha = require('mocha');
var assert = require('chai').assert;
var index = require('../routes/index');

describe('Index methods', () => {
    it('Returns true', done => {
        index
            .get('http://localhost:3000')
            .end(function (res) {
                expect(res.status).to.equal(200);
                done();
            })
    })
});
我的
index.test.js
文件:

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

/* GET home page. */
router.get('/', function (req, res, next) {
    res.send({val: true});
});

module.exports = router;
var mocha = require('mocha');
var assert = require('chai').assert;
var index = require('../routes/index');

describe('Index methods', () => {
    it('Returns true', done => {
        index
            .get('http://localhost:3000')
            .end(function (res) {
                expect(res.status).to.equal(200);
                done();
            })
    })
});
我使用教程来执行此操作,但当我尝试运行此操作时,我得到:

TypeError: index.get(...).end is not a function
所以我猜是出了什么问题,但不知道是什么。这是我学习TDD的第一天,所以如果你看到任何愚蠢的事情,请告诉我

这样做:

it('Returns true', done => {
    var resp = index.get('http://localhost:3000/');
    assert.equal(resp.val === true);
    done();
})
也会导致错误:

AssertionError: expected false to equal undefined
先装柴

it('Returns true', done => {
            return chai.request(index)
                .get('/')
                .then(function (res) {
                    expect(res.status).to.equal(200);
                    done();
                })
        })
先装柴

it('Returns true', done => {
            return chai.request(index)
                .get('/')
                .then(function (res) {
                    expect(res.status).to.equal(200);
                    done();
                })
        })
同样在终端类型
npmi supertest中——保存dev

同样在终端类型
npmi超级测试中——保存dev

1。安装mocha的开发依赖项
  • :节点和浏览器的断言库
  • :Chai断言库的HTTP响应断言
2.您需要导出服务器, 3.将您的测试编写为: 如果您的测试脚本是users.spec.js,它应该从以下内容开始:

//在休息期间,en变量设置为test
/*请在每次之前描述它*/
process.env.NODE_env='test';
const User=require('../app/models/User');
//需要开发依赖项
const chai=要求(“chai”);
const chaiHttp=require('chai-http');
//您需要导入服务器
const server=require(“../server”);
const should=chai.should();
//设置Http断言库
柴胡;柴胡;
//你的测试
描述('用户',()=>{
每次之前((完成)=>{
User.remove({},(err)=>{
完成();
});
});
/**
*测试GET/api/users
*/
描述('GET/api/users',()=>{
它('应该得到所有用户',(完成)=>{
请求(服务器)
.get(“/api/users”)
.end((错误、恢复)=>{
res.应具有的状态(200);
res.body.should.be.a('array');
res.body.length.should.eql(0);
完成();
});
});
});
//更多测试。。。
});1。安装mocha的开发依赖项
  • :节点和浏览器的断言库
  • :Chai断言库的HTTP响应断言
2.您需要导出服务器, 3.将您的测试编写为: 如果您的测试脚本是users.spec.js,它应该从以下内容开始:

//在休息期间,en变量设置为test
/*请在每次之前描述它*/
process.env.NODE_env='test';
const User=require('../app/models/User');
//需要开发依赖项
const chai=要求(“chai”);
const chaiHttp=require('chai-http');
//您需要导入服务器
const server=require(“../server”);
const should=chai.should();
//设置Http断言库
柴胡;柴胡;
//你的测试
描述('用户',()=>{
每次之前((完成)=>{
User.remove({},(err)=>{
完成();
});
});
/**
*测试GET/api/users
*/
描述('GET/api/users',()=>{
它('应该得到所有用户',(完成)=>{
请求(服务器)
.get(“/api/users”)
.end((错误、恢复)=>{
res.应具有的状态(200);
res.body.should.be.a('array');
res.body.length.should.eql(0);
完成();
});
});
});
//更多测试。。。

});检查服务器是否正常运行的简单测试用例

const chai = require('chai'),
chaiHttp = require('chai-http'),
server = require('../app'),
faker = require('faker'),
should = chai.should();

chai.use(chaiHttp);

describe('Init', function () {

it('check app status', function (done) {
  chai.request(server).get('/').end((err, res) => {
    should.not.exist(err);
    res.should.have.status(200);
    done();
  })
});

});
GETAPI的测试用例

describe('/Get API test', function () {

  it('Check the api without user id parameter', function (done) {
    chai.request(server).get('/post-list').end((err, res) => {
      should.not.exist(err);
      res.should.have.status(401);
      res.body.should.be.a('object');
      res.body.should.have.property('message');
      res.body.should.have.property('message').eql('User Id parameter is missing');
      done();
    })
  });

  it('Check the api with user id. Success', function (done) {
    chai.request(server).get('/post-list?user_id=1').end((err, res) => {
      should.not.exist(err);
      res.should.have.status(200);
      res.body.should.be.a('object');
      res.body.should.have.property('userId');
      res.body.should.have.property('title');
      res.body.should.have.property('body');
      done();
    })
  });

});
PostAPI的测试用例

describe('/POST API test', function () {

  it('Check the api without parameters . failure case', function (done) {
    chai.request(server).post('/submit-data').send({}).end((err, res) => {
      should.not.exist(err);
      res.should.have.status(401);
      res.body.should.be.a('object');
      res.body.should.have.property('message');
      res.body.should.have.property('message').eql('Mandatory params are missing!');
      done();
    })
  });

  it('Check the API with valid parameters. Success', function (done) { 
    chai.request(server).post('/submit-data').send({name:faker.name.firstName(),email:faker.internet.email()}).end((err, res) => { 
      should.not.exist(err);
      res.should.have.status(200);
      res.body.should.be.a('object');
      res.body.should.have.property('message');
      res.body.should.have.property('message').eql('data saved successfully');
      done();
    })
  });

});
根据API中可用的不同用例添加测试用例


在这里找到基本术语和完整的示例应用程序以继续:

检查服务器是否正常运行的简单测试用例

const chai = require('chai'),
chaiHttp = require('chai-http'),
server = require('../app'),
faker = require('faker'),
should = chai.should();

chai.use(chaiHttp);

describe('Init', function () {

it('check app status', function (done) {
  chai.request(server).get('/').end((err, res) => {
    should.not.exist(err);
    res.should.have.status(200);
    done();
  })
});

});
GETAPI的测试用例

describe('/Get API test', function () {

  it('Check the api without user id parameter', function (done) {
    chai.request(server).get('/post-list').end((err, res) => {
      should.not.exist(err);
      res.should.have.status(401);
      res.body.should.be.a('object');
      res.body.should.have.property('message');
      res.body.should.have.property('message').eql('User Id parameter is missing');
      done();
    })
  });

  it('Check the api with user id. Success', function (done) {
    chai.request(server).get('/post-list?user_id=1').end((err, res) => {
      should.not.exist(err);
      res.should.have.status(200);
      res.body.should.be.a('object');
      res.body.should.have.property('userId');
      res.body.should.have.property('title');
      res.body.should.have.property('body');
      done();
    })
  });

});
PostAPI的测试用例

describe('/POST API test', function () {

  it('Check the api without parameters . failure case', function (done) {
    chai.request(server).post('/submit-data').send({}).end((err, res) => {
      should.not.exist(err);
      res.should.have.status(401);
      res.body.should.be.a('object');
      res.body.should.have.property('message');
      res.body.should.have.property('message').eql('Mandatory params are missing!');
      done();
    })
  });

  it('Check the API with valid parameters. Success', function (done) { 
    chai.request(server).post('/submit-data').send({name:faker.name.firstName(),email:faker.internet.email()}).end((err, res) => { 
      should.not.exist(err);
      res.should.have.status(200);
      res.body.should.be.a('object');
      res.body.should.have.property('message');
      res.body.should.have.property('message').eql('data saved successfully');
      done();
    })
  });

});
根据API中可用的不同用例添加测试用例



在这里找到基本术语和完整的示例应用程序以继续:

您能显示../routes/索引文件吗?这是其中的第一个文件我想您正在尝试使用supertest模块发出API请求检查我的答案。您能显示../routes/索引文件吗?这是其中的第一个文件我想您正在尝试使用supertest模块发出API请求超级测试模块检查我的答案。那么我必须通过我的服务器文件吗?(就我而言,
app.js
)?那么,我如何将其分解为不同的文件中的代码呢?是的,您需要从app.js
module.exports=app
导出您的服务器,然后将其作为
const server=require('./app')
导入到index.test.js,我现在就知道了。谢谢所以我必须传递我的服务器文件?(就我而言,
app.js
)?那么,我如何将其分解为不同的文件中的代码呢?是的,您需要从app.js
module.exports=app
导出您的服务器,然后将其作为
const server=require('./app')
导入到index.test.js,我现在就知道了。谢谢请参阅更新的ans。您还需要在文件中要求您的应用程序实例。在中导出您的应用程序实例,或无论您的入口点是什么。请参阅更新的ans。您还需要在文件中要求您的应用程序实例。在中导出您的应用程序实例,或无论您的入口点是什么。@alex.iron是否在任何位置使用apply变量?@alex.iron是否使用在任何地方应用变量?