Node.js 膝关节炎的服务器测试

Node.js 膝关节炎的服务器测试,node.js,sonarqube,koa2,sinon-chai,Node.js,Sonarqube,Koa2,Sinon Chai,我在NodeJS中使用Koa进行web开发,我有一个服务器文件,它除了启动服务器和初始化一些中间件之外什么都不做。下面是示例代码 server.js const Koa = require('koa'); var Router = require('koa-router'); var bodyParser = require('koa-bodyparser'); var app = new Koa(); var router = new Router(); app.use(bodyParser(

我在
NodeJS
中使用
Koa
进行web开发,我有一个服务器文件,它除了启动服务器和初始化一些中间件之外什么都不做。下面是示例代码

server.js

const Koa = require('koa');
var Router = require('koa-router');
var bodyParser = require('koa-bodyparser');
var app = new Koa();
var router = new Router();
app.use(bodyParser());
router.post('/abc', AbcController.abcAction);
router.post('/pqr', PqrController.pqrAction);

app.use(router.routes());
app.listen(3000);
当我们运行npm start时,服务器将在3000端口上启动,现在我想使用
mocha、chai和sinon
为这个文件编写单元测试用例

一种方法是创建一个测试文件,比如说
server\u test.js
,并执行如下操作(仅举一个示例):

为此,我们需要在server.js中添加以下行

var server = app.listen(3000);
module.exports = server;
这是一个好的做法吗?我认为我们不应该以这种方式公开服务器?

由于此文件中没有自建函数,是否真的需要测试?

我们是否也应该将此类文件排除在sonarqube覆盖范围之外?


任何其他更好的建议都是受欢迎的。需要你们的帮助。谢谢。

您可以使用http测试端点

这是我在我的项目中使用的

const chai = require('chai');
const chaiHttp = require('chai-http');
const expect = chai.expect;

const app = require('../app');

describe('/GET roles', function () {
  it('should return bla bla bla',
    function (done) {
      chai.request(app)
        .get('/roles')
        .end(function (err, res) {
          expect(res.status).eql(200)
          expect(res.body).to.have.property('message').eql('Get role list success');
          expect(res.body).to.have.property('roles');
          expect(err).to.be.null;
          done();
        });
    }
  );
});

主要有两种方法可以实际处理rest案例

一种是将测试用例与源代码文件放在一起。(在您的情况下,应该是server.spec.js)。我个人更喜欢这种方式,因为它鼓励代码模块化,并使您的模块完全独立

另一种方法是创建另一个目录,比如test,在这里您可以按照主应用程序所遵循的相同目录结构放置整个测试用例。这对于只在开发阶段考虑测试用例的应用程序非常有用,然后在生产时您可以忽略发送这些文件

此外,我通常更喜欢遵循函数式编程的概念,因为它确实有助于独立测试每个代码块


希望这有助于

这是Express项目,我认为Koa可以用同样的方法来测试我需要在不同的测试文件中测试我的服务器文件,然后我将不得不导入<代码>服务器< /代码>…根据我的说法,这是个好习惯吗。不,创建一个函数,比如'init',并使用存根和间谍为该函数编写一个测试用例。查看“重新布线”模块,您不必为了测试该功能而导出任何私人小说。此外,您的测试用例应该是独立的。如果您认为您仍然需要一些重要的文件才能让测试用例工作,那么就这样通过它:mocha-requirement your_required_file.js
const chai = require('chai');
const chaiHttp = require('chai-http');
const expect = chai.expect;

const app = require('../app');

describe('/GET roles', function () {
  it('should return bla bla bla',
    function (done) {
      chai.request(app)
        .get('/roles')
        .end(function (err, res) {
          expect(res.status).eql(200)
          expect(res.body).to.have.property('message').eql('Get role list success');
          expect(res.body).to.have.property('roles');
          expect(err).to.be.null;
          done();
        });
    }
  );
});