伊斯坦布尔没有生成 mocha chai 和 chai-http 测试的覆盖范围

Istanbul is not generating the coverage for mocha chai and chai-http test

我正在尝试为我的 api.I 生成 istanbul 代码覆盖范围,已经研究了 SO 中的许多答案以及 istanbul 的文档,但对我来说没有任何效果。 mocha 测试 运行 很好,一切都通过了,甚至伊斯坦布尔也在创建 coverage 文件夹,但它没有在 it.My 中创建报告应用程序很简单express 应用程序,我正在为此使用 chai、chai-http 和 mocha。下面是我的 test/app.js 文件和 package.json 文件的代码。

const app=require('../app');
const chai=require('chai');
const chaiHttp=require('chai-http');
const should=chai.should();
const tokenForToday="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImFudXJhbmJhcm1hbkBnbWFpbC5jb20iLCJpYXQiOjE1MTc1Mzg4ODcsImV4cCI6MTUxNzYyNTI4N30.8YJ35mwWhzz4kT-fruhcPANUXyZJYvCsKKHTejZNnWA";
chai.use(chaiHttp);

describe('CB API',()=>{
    /**
     * Test /api route
     */

    describe('/GET api',()=>{
      it('it should GET the api default content', (done) => {
      chai.request(app)
          .get('/api')
          .end((err, res) => {
              res.should.have.status(200);
              res.body.should.be.eql({message:'Welcome to Cloudboost API'});
            done();
          });
      });
    })

    /**
     * Test /login POST route
     */
     describe('/POST login',()=>{
       it('it should return the authentication token', (done) => {
         let bdy={
           email:"anuranbarman@gmail.com",
           password:"anuran"
         }
       chai.request(app)
           .post('/api/login')
           .send(bdy)
           .end((err, res) => {
               res.should.have.status(200);
               res.body.should.have.property('token');
               res.body.should.have.property('auth').eql(true);
             done();
           });
       });
     })

     /**
      * Test /login POST without email field
      */
      describe('/POST login',()=>{
        it('it should return false success', (done) => {
          let bdy={
            password:"anuran"
          }
        chai.request(app)
            .post('/api/login')
            .send(bdy)
            .end((err, res) => {
                res.should.have.status(422);
                res.body.should.have.property('auth').eql(false);
              done();
            });
        });
      })

      /**
       * Test /image route without token
       */
       describe('/POST image without token',()=>{
         it('it should return false success', (done) => {
           let bdy={
             url:"https://d1qb2nb5cznatu.cloudfront.net/startups/i/490103-917cc2864d0246e313e9521971422f09-medium_jpg.jpg?buster=1430997518"
           }
         chai.request(app)
             .post('/api/image')
             .send(bdy)
             .end((err, res) => {
                 res.should.have.status(401);
                 res.body.should.have.property('success').eql(false);
               done();
             });
         });
       })

       /**
        * Test /image with token but with invalid url
        */
        describe('/POST image with invalid url',()=>{
          it('it should return false success', (done) => {
            let bdy={
              url:"https://d1qb2nb5cznatu.cloudfrt.net/startups/i/490103-917cc2864d0246e313e9521971422f09-medium_jpg.jpg?buster=1430997518"
            }
          chai.request(app)
              .post('/api/image')
              .set('token',tokenForToday)
              .send(bdy)
              .end((err, res) => {
                  res.should.have.status(500);
                  res.body.should.have.property('success').eql(false);
                done();
              });
          });
        })

        /**
         * Test /image with token but with NO url
         */
         describe('/POST image with no url',()=>{
           it('it should return false success', (done) => {

           chai.request(app)
               .post('/api/image')
               .set('token',tokenForToday)
               .end((err, res) => {
                   res.should.have.status(422);
                   res.body.should.have.property('success').eql(false);
                 done();
               });
           });
         })

         /**
          * Test /image with token and with valid url
          */
          describe('/POST image',()=>{
            it('it should return false success', (done) => {
              let bdy={
                url:"https://d1qb2nb5cznatu.cloudfront.net/startups/i/490103-917cc2864d0246e313e9521971422f09-medium_jpg.jpg?buster=1430997518"
              }
            chai.request(app)
                .post('/api/image')
                .set('token',tokenForToday)
                .send(bdy)
                .end((err, res) => {
                    res.should.have.status(200);
                  done();
                });
            });
          })


          /**
           * Test /image with invalid token but with valid url
           */
           describe('/POST image',()=>{
             it('it should return false success', (done) => {
               let bdy={
                 url:"https://d1qb2nb5cznatu.cloudfront.net/startups/i/490103-917cc2864d0246e313e9521971422f09-medium_jpg.jpg?buster=1430997518"
               }
             chai.request(app)
                 .post('/api/image')
                 .set('token','tokenForToday')
                 .send(bdy)
                 .end((err, res) => {
                     res.should.have.status(500);
                     res.body.should.have.property('success').eql(false);
                   done();
                 });
             });
           })

           /**
            * Test /patch with token and data and patch
            */
            describe('/PATCH patch',()=>{
              it('it should return success', (done) => {
                const dataString=JSON.stringify({
                        name: "dante",
                        age: "22"
                });
                const patchString=JSON.stringify([
                  { "op": "replace", "path": "/name", "value": "anuran" },
                  { "op": "add", "path": "/position", "value": "NodeJS Developer" }
                ])
                let bdy={
                  data:dataString,
                  patch:patchString
                }

              chai.request(app)
                  .patch('/api/patch')
                  .set('token',tokenForToday)
                  .set('content-type', 'application/x-www-form-urlencoded')
                  .send(bdy)
                  .end((err, res) => {
                    console.log(res.body);
                      res.should.have.status(200);
                      res.body.should.have.property('success').eql(true);
                    done();
                  });
              });
            })


            /**
             * Test /patch without token
             */
             describe('/PATCH patch',()=>{
               it('it should return false success', (done) => {
                 const dataString=JSON.stringify({
                         name: "dante",
                         age: "22"
                 });
                 const patchString=JSON.stringify([
                   { "op": "replace", "path": "/name", "value": "anuran" },
                   { "op": "add", "path": "/position", "value": "NodeJS Developer" }
                 ])
                 let bdy={
                   data:dataString,
                   patch:patchString
                 }

               chai.request(app)
                   .patch('/api/patch')
                   .set('content-type', 'application/x-www-form-urlencoded')
                   .send(bdy)
                   .end((err, res) => {
                     console.log(res.body);
                       res.should.have.status(422);
                       res.body.should.have.property('success').eql(false);
                     done();
                   });
               });
             })


             /**
              * Test /patch without data field
              */
              describe('/PATCH patch',()=>{
                it('it should return false', (done) => {

                  const patchString=JSON.stringify([
                    { "op": "replace", "path": "/name", "value": "anuran" },
                    { "op": "add", "path": "/position", "value": "NodeJS Developer" }
                  ])
                  let bdy={
                    patch:patchString
                  }

                chai.request(app)
                    .patch('/api/patch')
                    .set('token',tokenForToday)
                    .set('content-type', 'application/x-www-form-urlencoded')
                    .send(bdy)
                    .end((err, res) => {
                      console.log(res.body);
                        res.should.have.status(422);
                        res.body.should.have.property('success').eql(false);
                      done();
                    });
                });
              })

              /**
               * Test /patch with invalid patch object
               */
               describe('/PATCH patch',()=>{
                 it('it should return false success', (done) => {
                   const dataString=JSON.stringify({
                           name: "dante",
                           age: "22"
                   });
                   const patchString=JSON.stringify([
                     { "op": "INVALID", "path": "/name", "value": "anuran" },
                     { "op": "add", "path": "/position", "value": "NodeJS Developer" }
                   ])
                   let bdy={
                     data:dataString,
                     patch:patchString
                   }

                 chai.request(app)
                     .patch('/api/patch')
                     .set('token',tokenForToday)
                     .set('content-type', 'application/x-www-form-urlencoded')
                     .send(bdy)
                     .end((err, res) => {
                       console.log(res.body);
                         res.should.have.status(200);
                         res.body.should.have.property('success').eql(false);
                       done();
                     });
                 });
               })
})

package.json

{
  "name": "cb-assignment",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node app.js",
    "test": "mocha --timeout 10000 --exit"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.18.2",
    "chai": "^4.1.2",
    "chai-http": "^3.0.0",
    "easyimage": "^3.0.0",
    "express": "^4.16.2",
    "express-session": "^1.15.6",
    "imagemagick": "^0.1.3",
    "jsonpatch": "^3.0.1",
    "jsonwebtoken": "^8.1.1",
    "mocha": "^5.0.0",
    "node-image-resize": "0.0.2",
    "request": "^2.83.0"
  },
  "devDependencies": {
    "istanbul": "^0.4.5"
  }
}

我是 运行 从命令行使用此命令:

sudo ./node_modules/istanbul 覆盖./node_modules/.bin/_mocha

对于我的 node.js (typescript) 项目,我使用这种脚本进行测试和覆盖:

"test": npm-run-all --parallel build:watch cross-env DOTENV_FILE=.env.test nodemon -e ts --exec mocha build/**/unit/**/*.spec.js --recursive --inspect --watch --reporter spec --bail

只需从 npm run test

开始

编辑:

伊斯坦布尔:

第 1 步 - 运行 你在伊斯坦布尔的服务器

$ ./node_modules/.bin/istanbul cover --handle-sigint  server.js

第 2 步 - 运行 您的测试,无需 运行 在伊斯坦布尔

$ ./node_modules/.bin/_mocha  -R spec ./.instrument/test/** --recursive

完整报告在coverage/lcov-report/index.html

您可以在覆盖脚本后添加 --exit 标志