2017-09-16 45 views
1

您好我正在尝试运行mocha和chai测试来测试我的节点js路由器,它将用户保存在mysql数据库中,然后返回相同的数组。测试将数据保存在数据库中

我目前面临的问题是,当我从本地运行它并且使用像Travis/Ci这样的连续集成软件时,我不想将信息保存在数据库中,因为测试失败,因为没有数据库连接。我想知道如何在没有实际保存到数据库的情况下测试数据库保存。

基本上有一个假的虚拟数据库来保存或返回保存。

我读到sinon.js可以帮助,但我很不确定如何使用它。

这里是我的代码

var expect = require('chai').expect; 
var faker = require('faker'); 
const request = require('supertest'); 
const should = require('should'); 
const sinon = require('sinon'); 
const helper = require('../../models/user'); 

describe('POST /saveUser',()=>{ 
    it('should save a new user',(done)=>{ 
     var fake = 
     request(app) 
      .post('/saveUser') 
      .send({ 
       Owner : faker.random.number(), 
       firstname : faker.name.firstName(), 
       lastname : faker.name.lastName(), 
       email:faker.internet.email(), 
       password : faker.random.number(), 
       token : faker.random.uuid() 
      }) 
      .expect(200) 
      .expect((res)=>{ 
       expect(res.body.firstname).to.be.a("string"); 
       expect(res.body.lastname).to.be.a("string"); 
       expect(res.body.Owner).to.be.a("number"); 
      }) 
      .end(done); 
    }); 
}); 

这是路由器

router.post('/saveUser',(req,res,next)=>{ 
    saveUser(req.body).then((result)=>{ 
     return res.send(req.body); 
    }).catch((e)=>{ 
     return res.send('All info not saved'); 
    }); 
}); 

这里是模型

saveUser = (userinfo) => new Promise((resolve,reject)=>{ 
    db.query('INSERT INTO user SET ?',userinfo,function(error,results,fields){ 
     if(error){ 
      reject(); 
     }else{ 
      resolve(userinfo); 
     } 
    }) 
}); 

回答

0

你所描述的是一个存根。随着兴农您可以存根方法,并调用假的方法,而不是像这样:

sinon.stub(/* module that implements saveUser */, 'saveUser').callsFake(() => Promise.resolve()); 
+0

对不起已故的答复,你这是实现saveUser,可以请你用我的代码与您的评论模块的意思,我是新来的这和它很难理解。 –

+0

您的saveUser方法在某些文件中实现,在模型/用户中我想呢?您必须在该文件中导出saveUser,然后您可以存根:sinon.stub(helper,'saveUser') – justadudewhohacks

+0

所以基本上是这样的 const {saveUser} = require('../../ models/user') ; (saveUser,'saveUser')。callsFake(()=> Promise.resolve()); sinon.stub –