Search code examples
javascriptnode.jsmocha.jses6-classsinon-chai

Javascript class getter setter shows Uncovered Line under unit test


I have following javascript class and writing unit test using mocha and sinon. When I run test case I see uncovered lines for 'return this._agentId;' and 'this._agentId = value;'.I am not sure how to cover these lines under test.I am using Istanbul test coverage tool to see coverage.

// Agentmessage.js

    class AgentMessage {
        constructor(agentId, message) {
            this._agentId = agentId;
            this._message = message;
        }

        get agentId() {
            return this._agentId;
        }

        set agentId(value) {
            this._agentId = value;
        }

    }

    module.exports = AgentMessage;

// Agentmessage.test.js

    'use strict';

    const chai=require('chai');
    const sinon=require('sinon');
    var chaiAsPromised=require('chai-as-promised');
    chai.use(chaiAsPromised).should();
    const expect = chai.expect;
    const agentMessage = require('../src/model/agentMessage');

    describe('agentMessage test',function() {
        let sandbox;
        let agentMessageObj;
        beforeEach(() => {
            agentMessageObj = new agentMessage('agentId', 'message');
            sandbox=sinon.sandbox.create();
        });

        afterEach(() => {
            sandbox.restore();
        });
        it('agentMessage set agentId Test',() => {
            agentMessageObj.agentId = 'agentId';
            expect(agentMessageObj.agentId).to.deep.equal('agentId');
        });
        it('agentMessage get agentId Test',() => {
            expect(agentMessageObj.agentId).to.equal('agentId');
        });

    });

Solution

  • I am not seeing the same issue you are. I get 100% coverage.

    You say istanbul but you are in fact using the nyc package correct? I think you'll find that the instanbul project suggests you use the nyc runner if you are not already.

    Consider refreshing your environment if you are able.

    rm -rf .nyc_output && rm -rf coverage && rm -rf node_modules
    npm i --save-dev nyc mocha chai
    

    If that does not clear things up, consider removing things, temporarily at least, that you are not using in these particular tests. sinon and chai-as-promised for example. Isolate the code. See if there are some conflicts there.

    Try this similar code. I get full coverage.

    ./node_modules/.bin/nyc --reporter html ./node_modules/.bin/mocha test.js
    

    test.js

    const { expect } = require('chai')
    const AgentMessage = require('./index');
    
    describe('agentMessage test', function () {
      let agentMessage;
    
      beforeEach(function () {
        agentMessage = new AgentMessage('agentId01', 'message02');
      });
    
      it('agentMessage set agentId Test', async function () {
        agentMessage.agentId = 'agentId02';
        expect(agentMessage.agentId).to.deep.equal('agentId02');
      });
    });
    

    If after all of that, if it is still a problem, if you're using a more advanced configuration of nyc/istanbul, start stripping away that configuration and using default properties. See if you find the sweet/troubled part.