LearnBoost / tobi

Tobi: Expressive server-side functional testing with jQuery
408 stars 33 forks source link

$ undefined in vows callback #55

Closed psd closed 13 years ago

psd commented 13 years ago

I'm keen to use tobi with vows, as outlined in this blog post

but am experiencing the same issue as one of the commenters with $ being undefined in the callback:

#!/usr/bin/env vows --spec

var vows   = require('vows');
var assert = require('assert');
var tobi   = require('tobi');

vows.describe('register').addBatch({
    'GET /register': {
        topic: function() {
            var browser = tobi.createBrowser(3000, 'localhost');
            browser.get("/register", this.callback);
        },
        'has a 200 status code': function(res, $) {
            res.should.have.status(200);
        },
        'is the Register page': function(res, $) {
            $('title').should.equal('Registration');
        }
    }
}).export(module);

results in:

♢ register

  GET /register
    ✓ has a 200 status code
    ✗ is the Register page
    TypeError: undefined is not a function
    at CALL_NON_FUNCTION (native)
    at Object.<anonymous> (/site/test/x.js:17:4)
    at runTest (/site/node_modules/vows/lib/vows.js:95:26)
    at EventEmitter.<anonymous> (/site/node_modules/vows/lib/vows.js:78:13)
    at EventEmitter.emit (events.js:81:20)
    at /site/node_modules/vows/lib/vows/context.js:31:52
    at /site/node_modules/vows/lib/vows/context.js:46:29
    at IncomingMessage.<anonymous> (/site/node_modules/tobi/lib/browser.js:264:9)
    at IncomingMessage.emit (events.js:81:20)
    at HTTPParser.onMessageComplete (http.js:133:23)
·
✗ Errored » 1 honored ∙ 1 errored (0.129s)
psd commented 13 years ago

This is issue with vows not passing more than one parameter. Vows assumes callbacks(err, res, ..) so if err is set, the remaining parameters are undefined.

A work-round is to not use the vows callback directly, but insert a null err value, e.g.::

    browser.get('/register', function (res, $) {
        this.callback(err, res, $);
    });
cmeiklejohn commented 13 years ago

This helped me get around the null problems, however the tobi objects now have no statusCode attribute.

 ♢ Test

  A hit
    ✗ should return 200
      » expected { external: undefined,
  history: [ '/' ],
  cookieJar: { cookies: [] },
  followRedirects: true,
  port: 80,
  host: 'www.google.com',
  client: 
   { bufferSize: 0,
     fd: null,
     type: null,
     allowHalfOpen: true,
     _writeImpl: [Function],
     _readImpl: [Function],
     _shutdownImpl: [Function],
     _state: 'connecting',
     ondrain: [Function],
     _outgoing: [ [Object] ],
     _events: { connect: [Function], close: [Function] },
     port: 80,
     host: 'www.google.com',
     _readWatcher: 
      { socket: [Circular],
        callback: [Function: onReadable] },
     destroyed: false,
     readable: false,
     _writeQueue: [],
     _writeQueueEncoding: [],
     _writeQueueFD: [],
     _writeQueueCallbacks: [],
     _writeWatcher: 
      { socket: [Circular],
        callback: [Function: onWritable] },
     writable: true,
     _connecting: true } } to have a property 'statusCode' // should.js:474