0

When running my tests they all pass. When running code coverage 4 fail due to functions being 'not defined'. They are defined (as the tests clearly show when they pass). I cannot get the code coverage for the file that has the 4 functions being tested in those tests which is not good as I need to know if the functions are fully tested.

I am on PHPStorm. The jsTestDriver for these tests has a file made by me, Sinon v7.3.2, jQuery v1.11.1, and D3.js v5.9.7 as dependencies.

load:
  - buttonActions.js
  - tests/dependencies/jquery.js
  - tests/dependencies/sinon732.js
  - tests/dependencies/d3.js

test:
  - tests/Functional/javascriptTests/actionsTestButtonActionsFunctions.test.js

timeout: 30

Partial code from buttonActions.js:

function _hideOrShow(table){

    var classNames = table[0]["attributes"][0]['nodeValue'];
    var secondClass = classNames.replace("sortable table-striped table-responsive ",'');

if (secondClass === "veryHidden" ) {
    table.removeClass("veryHidden").addClass("veryShown");
} else {
    table.removeClass("veryShown").addClass("veryHidden");
}

}

Partial code from my tests:

 ActionsTestButton = TestCase("ActionsTestButtonActions");

 ActionsTestButton.prototype.setUp = function() {
//stuff done here. Not important
}

ActionsTestButton.prototype.testHideOrShow = function () {

var table = {
    class: "sortable table-striped table-responsive veryHidden",
    0: {
        attributes: {
            0: {
                nodeValue: "sortable table-striped table-responsive veryHidden"
            }
        }
    },
    removeClass: function (name){
        table.class = table.class.replace(name, '');
        table[0]["attributes"][0]['nodeValue'] = table.class;
        return {
            addClass: function (name){
                table.class = table.class+name;
                table[0]["attributes"][0]['nodeValue'] = table.class;
            }
        }
    }

 };

assertEquals("sortable table-striped table-responsive veryHidden", table.class);
assertEquals("sortable table-striped table-responsive veryHidden", table[0]["attributes"][0]['nodeValue']);

_hideOrShow(table);

assertEquals("sortable table-striped table-responsive veryShown", table.class);
assertEquals("sortable table-striped table-responsive veryShown", table[0]["attributes"][0]['nodeValue']);

_hideOrShow(table);

 assertEquals("sortable table-striped table-responsive veryHidden", table.class);
 assertEquals("sortable table-striped table-responsive veryHidden", table[0]["attributes"][0]['nodeValue']);

 };

     ActionsTestButton.prototype.tearDown = function() {
document.getElementById.restore();
window.$.restore();
window.d3.select.restore();

 };

Error message I get running code coverage:

     line 178:4 mismatched input 'const' expecting RBRACE
     line 1022:12 no viable alternative at input 'throws'
     line 1236:13 mismatched input 'throws' expecting Identifier
     line 1236:31 extraneous input 'throws' expecting LPAREN
     line 3998:12 no viable alternative at input 'function'
     line 5123:14 missing Identifier at 'in'
     line 5123:17 no viable alternative at input '='
     line 5413:8 no viable alternative at input '}'
     line 5415:30 no viable alternative at input ']'

     ReferenceError: _removeIcons is not defined
at b.ActionsTestButton.testPrivateRemoveIcons (http://127.0.0.1:9876/test/tests/Functional/javascriptTests/actionsTestButtonActionsFunctions.test.js:179:5)
at TestResultIterator.runTest (http://127.0.0.1:9876/test/com/google/jstestdriver/coverage/javascript/LCOV.js:201:28)
at TestResultIterator.runNext (http://127.0.0.1:9876/test/com/google/jstestdriver/coverage/javascript/LCOV.js:292:10)
at InstrumentedTestCaseRunner.run (http://127.0.0.1:9876/test/com/google/jstestdriver/coverage/javascript/LCOV.js:250:27)
at InstrumentedTestCaseRunnerPlugin.runTestConfiguration (http://127.0.0.1:9876/test/com/google/jstestdriver/coverage/javascript/LCOV.js:221:20)



     ReferenceError: _reAddIcon is not defined
at b.ActionsTestButton.testPrivateReAddIcons (http://127.0.0.1:9876/test/tests/Functional/javascriptTests/actionsTestButtonActionsFunctions.test.js:196:5)
at TestResultIterator.runTest (http://127.0.0.1:9876/test/com/google/jstestdriver/coverage/javascript/LCOV.js:201:28)
at TestResultIterator.runNext (http://127.0.0.1:9876/test/com/google/jstestdriver/coverage/javascript/LCOV.js:292:10)
at InstrumentedTestCaseRunner.run (http://127.0.0.1:9876/test/com/google/jstestdriver/coverage/javascript/LCOV.js:250:27)



     ReferenceError: _removeIcons is not defined
at b.ActionsTestButton.testRemoveThenAddRevertsBackToBlock (http://127.0.0.1:9876/test/tests/Functional/javascriptTests/actionsTestButtonActionsFunctions.test.js:214:5)
at TestResultIterator.runTest (http://127.0.0.1:9876/test/com/google/jstestdriver/coverage/javascript/LCOV.js:201:28)
at TestResultIterator.runNext (http://127.0.0.1:9876/test/com/google/jstestdriver/coverage/javascript/LCOV.js:292:10)
at InstrumentedTestCaseRunner.run (http://127.0.0.1:9876/test/com/google/jstestdriver/coverage/javascript/LCOV.js:250:27)



     ReferenceError: _hideOrShow is not defined
at b.ActionsTestButton.testHideOrShow (http://127.0.0.1:9876/test/tests/Functional/javascriptTests/actionsTestButtonActionsFunctions.test.js:251:5)
at TestResultIterator.runTest (http://127.0.0.1:9876/test/com/google/jstestdriver/coverage/javascript/LCOV.js:201:28)
at TestResultIterator.runNext (http://127.0.0.1:9876/test/com/google/jstestdriver/coverage/javascript/LCOV.js:292:10)
at InstrumentedTestCaseRunner.run (http://127.0.0.1:9876/test/com/google/jstestdriver/coverage/javascript/LCOV.js:250:27)



     Process finished with exit code 0

I just want to get code coverage for this file. It works for all my other file tests. Just not this one.

Sharon
  • 138
  • 16
  • It seems like unit tests are running in the context of a browser, where each file under `load` has access to the global namespace. Your code coverage tool may be expecting `import` or `require` statements in the entrypoint file in order to access external modules. Meaning if `actionsTestButtonActionsFunctions.test.js` doesn't import `buttonActions.js`, it won't have access to the methods of that file. – SteamDev Aug 06 '19 at 16:14
  • @SteamDev I don't have require in any of my files though and they work :( I get errors if I try and include 'require'. The jsTestDriver is the file running and it loads buttonActions before the tests start so i thought that would be okay (which it is for tests but code coverage doesn't seem to see it). – Sharon Aug 06 '19 at 16:18
  • 1
    Sorry, `require` is CommonJS (NodeJS) specific, if this is not a node project try using ES6 `import` in your test.js file to load the undefined references. – SteamDev Aug 06 '19 at 17:38
  • @SteamDev, it just causes syntax errors and makes my tests not run at all :( I don't think jstd likes import statements in the files it runs – Sharon Aug 07 '19 at 08:46
  • I used the https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import examples – Sharon Aug 07 '19 at 08:47

1 Answers1

1

Code coverage in JSTestDriver does not like let and const. It will not run code coverage on any files that contain it and will not allow functions from a file that contains it.

For my particular case I had a function that used const. The function that used it was not called in the functions I was testing and thus was never tested at all. This meant the tests passed. However, being in the same file was enough to make code coverage break.

My solution? Change both let and const to var. Semantically it may not be the best idea but in my case it made no noticeable difference to my code or the behaviour.

Sharon
  • 138
  • 16