O'Reilly logo

Test Driven Ajax (on Rails) by Phlip

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

Lexing JavaScript with assert_js

To test JavaScript without writing an entire web browser in Ruby, install Ruby's venerated ancestor Perl, and then install this package:

http://corion.net/perl-dev/Javascript-PurePerl-0.08.tar.gz

It contains a lexer that converts JavaScript into XML describing each lexeme. Write this little snip of Perl into a file called jsToXml.pl:

  use strict;
  use Javascript::PurePerl;

  open(JS, 'tmp/sample.js');
  read(JS, my $source, -s JS);
  close(JS);
  my $tree = Javascript::PurePerl->new()->parse( code => $source );

  print $tree->toString,"\n";

It reads a temporary file called sample.js, converts its contents to XML, and emits that to its stdout. We can wrap that Perl up in this Ruby assertion:

  def assert_js(source)
    File.open('tmp/sample.js', 'w'){|f|  f.write(source)  }
    assert_xml `perl jsToXml.pl`

    assert_xpath '/AST/Program/SourceElements' do |node|
      yield(node) if block_given?
    end
  end

The program jsToXml.pl returns a big XML tree, packed with every obscene detail of your JavaScript. Where your JavaScript had a simple term like "Ajax.Updater", Javascript::PurePerl explains it all, like this:

  <MemberMemberExpression name='ClassExpression'>
    <Identifier name='lhs'>Ajax</Identifier>
    <Identifier name='member'>Updater</Identifier>
  </MemberMemberExpression>

Nobody should write assertions for all of that! We only need to query into that huge database, and fetch out a few specific details. And that's where assert_xpath shines:

 def test_assert_js yaml_to_xhtml(get_omap) hammy_id ...

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required