我正在尝试为我的api生成伊斯坦布尔代码覆盖率。我已经在SO和伊斯坦布尔文档中调查了很多答案,但没有任何结果对我有用。摩卡测试运行良好,一切都通过了,即使伊斯坦布尔也正在创建coverage文件夹,但它并未在其中创建报告。我的应用程序是简单的快速应用程序,我正在使用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:"[email protected]",
           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(打字稿)项目,我使用这种脚本进行测试和覆盖:

"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

关于node.js - Istanbul 尔未生成Mocha Chai和Chai-http测试的覆盖范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48587240/

10-11 04:15