2
votes

I'd like to do some BDD using Mocha and PhantomJS only.
Define a few functional paths and test 'em.

In short, I'd love to run the command phantomjs test.js while test.js contains something like this:

var mocha = require("mocha"); // This one fails with "ReferenceError: Can't find variable: process"..... "/node_modules/mocha/index.js:2"

var page = require('webpage').create();

describe('Empty', function(){ // Obviously this one fails too with "ReferenceError: Can't find variable: describe"
  describe('tests are', function(){
    it('very nice', function(done){
      page.open("http://www.phantomjs.org/", function (status) {
          console.log('Loading a web page');
          console.log("Page is loaded");
          phantom.exit(); // Or, just call `done()`, doesn't matter right now
      });
    })
  })
})

Can you recognize the code pieces of the two?

How can I make this work? I've read on some page that I could require() "mocha.js" of the browser version, but it doesn't seem to work very well.

------------------More details ------------------------------------

I've tried CasperJS but besides providing some really nice stuff, I miss Mocha's appealing test design (server-side).

All the examples I've seen explain how to run your Mocha tests on the webpage (browser-side) (with a script tag), rather than the NodeJS test script.
I don't like it, I want to keep the test pure-console, in addition to the fact that this approach encourages me to add testing code to my webpages.

I've seen a few projects trying to ease that approach yet I'm not content with it - it seems like they've done 95% of the requirement by bringing Mocha and PhantomJS, but the last 5% are still undone, the stuff that really connect it together.

2
Found this awesome project ( github.com/alexscheelmeyer/node-phantom ), but it's unclear how things are done over there.. I like the idea of remote controlling PhantomJS.. Not sure I should use it, as it seems to be a small project with limited (future) support..Poni
Something to note is that PhantomJS is a headless webkit browser (V8 runtime), and Mocha is designed to run on a Node runtime. Requiring Mocha fails because process is something Node provides for scripts (unavailable in browsers).Michael Tang

2 Answers

3
votes

You may want to run your tests still in a Node context (node test.js), but controlling phantomJS from node with something like the node-phantom library.

Something TJ Holowaychuk does in all of his libraries is this process.env.COV check (which I personally don't understand), but it's likely that PhantomJS won't support the process variable.

You might be able to trick Mocha by setting window.process and window.process.env to empty objects, though I'd guess you'll run into more PhantomJS/Node issues later on.

0
votes

Running phantomjs via the bridge from node may not be the best option.

There is phantomjs-nodeify module (I forked from http://github.com/jgonera) that makes phantomjs environment more like node environment - it adds modules process, events, etc. to phantomjs.

There is webspecter framework that achieved exactly that, with old phantomjs and old mocha though.

It seems possible to make mocha tests run in phantom 2.0.