mocha init timeout with mocha-phantomjs

2020-06-12 04:44发布

问题:

I have the following testrunner.html:

<html>
  <head>
    <title>Specs</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link rel="stylesheet" href="/content/css/mocha.css" />
    <script>
        function assert(expr, msg) {
            if (!expr) throw new Error(msg || 'failed');
        }
    </script>

    <script src="/client/lib/require.js" type="text/javascript" data-main="/client/specs/_runner.js"></script>

  </head>
  <body>
    <div id="mocha"></div>
  </body>
</html>

The _runner.js looks like this:

// Configure RequireJS
require.config({
    baseUrl: '/client',
    urlArgs: "v=" + (new Date()).getTime()
});

// Require libraries
require(['require', 'lib/chai', 'lib/mocha'], function (require, chai) {

    // Chai
    assert = chai.assert;
    should = chai.should();
    expect = chai.expect;

    // Mocha
    mocha.setup('bdd');


    // Require base tests before starting
    require(['specs/stringcalculator.specs'], function (person) {
        mocha.setup({ globals: ['hasCert'] });
        // Start runner
        if (window.mochaPhantomJS) {
            mochaPhantomJS.run();
        }
        else { mocha.run(); }
    });

});

The StringCalculator.specs.js is this:

define(['app/model/StringCalculator'], function () {

    describe("StringCalculator", function () {

        describe("when an empty string is passed in", function () {
            it("returns 0", function () {
                var result = StringCalculator.add("");
                assert(result === 0);
            });
        });

        describe("when a number is passed in", function () {
            it("returns the number", function () {
                var result = StringCalculator.add("2");
                assert(result === 2);
            });
        });

        describe("when string is passed in", function () {
            it("returns NaN", function () {
                var result = StringCalculator.add("a");
                assert(isNaN(result));
            });
        });

        describe("when '1,2' is passed in", function () {
            it("returns 3", function () {
                var result = StringCalculator.add("1,2");
                assert(result === 3);
            });
        });
    });
});

And this is the StringCalculator.js itself (from the mocha samples):

define([], function() {
    window.StringCalculator = StringCalculator = {
        add: function(inputString) {
            if (inputString === '') {
                return 0;
            }

            var result = 0;
            var inputStrings = inputString.split(',');

            for (var i = 0; i < inputStrings.length; i++) {
                result += parseInt(inputStrings[i]);
            }

            return result;
        }
    }
});

When running the specs in a browser calling testrunner.html, everything works as expected. When running mocha-phantomjs client/specs/testrunner.html on OS X, I get the following error:

Failed to start mocha: Init timeout

What may I'm missing here?

I also tried mocha-phantomjs http://httpjs.herokuapp.com which fails with the same error.

Update: If I'm calling mocha-phantomjs http://localhost:81/client/specs/testrunner.html I also get the following error on the console:

RangeError: Maximum call stack size exceeded.

http://localhost:81/client/lib/chai.js?v=123423553533535:2601
Failed to start mocha: Init timeout

回答1:

I was getting the same Failed to start mocha error when running mocha-phantomjs through the grunt-mocha-phantomjs npm package. Found the solution here.

Repeated here for reference:

To run with mocha-phantomjs, change

mocha.run();

to

if (mochaPhantomJS) {
  mochaPhantomJS.run();
}
else {
  mocha.run();
}


回答2:

This file shows how to use it.

And for me, NodeJS 0.10.x does not seem to work with it. After switching to NodeJS 0.8.8, everything works as expected.

Using the current versions of mocha-phantomjs and PhantomJS now everything works fine.



回答3:

Thanks for this info, I tried the above but it failed in browser saying "mochaPhantomJS is undefined". A quick tweak as per below and it works well:

if(typeof(mochaPhantomJS)!=="undefined")
{
  mochaPhantomJS.run();
}
else
{
  mocha.run();
}