nodejs 单元测试
nodejs koa 框架 实现Java 中mock+junit类似的单元测试。
需要用到的包mocha+should+sinon+supertest
1.首先需要实现登录功能,因为登录功能是个公共功能,所以写个公共模块。
我们的项目会把登录信息放在cookie 中,所以每次都会检测cookie 中的信息是否正确
function login(user) {
//在登陆时会用到,所以要一直保持
userBusCheck =sinon.stub(userBus,'check').returns(user);
}
function getRequest(user, callback) {
let request;
if (isLogin) {
request =superTest(app.listen());
//setTimeout(callback(request), 10);
}else {
request =superTest(app.listen());
login(user);
isLogin =true;
}
return callback(request);
}
上面的login 方法就是对真正的登录中的用户信息校验方法做了一个mock,每次当你通过http 请求调用后端的接口的时候,后端会解析你的cookie,检查你的cookie信息是否过期,检查你的信息是否在后端数据库中是否存在,sinon.stub(userBus,'check').returns(user); 表示当执行userBus.check()方法时,不会去执行具体的方法,而是直接返回你自己构造user对象,则直接验证登录通过了。也就可以访问到你的后端接口了
supertest 写的单元测试整体结构就是before+describe+after 这种结构的。describe 中就是我们要写到单元测试的具体逻辑。
一个describe 中可以写对一个接口的不同值的测试。describe 中的before 可以把这个接口中的涉及的数据库的或者第三方接口的通过sinon.stub 方法构造成返回假数据的形式。这样就能更加专注于逻辑功能的测试了,当然在after 方法中一定要把构造假值的对象释放掉,重复构造会报错的。
describe('/statistics/matcher/list',function () {
let matchDetailFindLimitOne;
before((done) => {
matchDetailFindLimitOne =sinon.stub(similarDetailsModel,'findLimit');
const matcherDetailStatDataList =lodash.cloneDeep(questionMatchDetailListTest.questionMatcherDetailList);
matchDetailFindLimitOne.returns({data:matcherDetailStatDataList,count:10});
done();
});
it('配题师工作量统计,个人工作量统计列表查询',function (done) {
request.get('/drm_api/v1/statistics/matcher/list?'+qs.stringify(query) )
.set('Cookie',cookie)
.set('Content-Type','application/json')
.expect(200)
.end((err, result) => {
should.not.exists(err);
result.body.code.should.equal(0);
result.body.msg.should.equal('ok');
result.body.data.list.length.should.equal(10);
done();
});
});
after((done) => {
matchDetailFindLimitOne.restore();
done();
});
});
单元测试报告
通过npm run test 开始跑所有的单元测试,通过npm run report 可以打开单元测试报告
单元测试覆盖率用的是nyc 包,通过npm run cov_report 可以打开单元测试覆盖率报告
网友评论