Run your Jasmine specs without launching a browser
Run your Jasmine specs without a browser
var jasmine = JsBdd;
var traceMonkey = Mozilla.JsEngine;
var johnson = Ruby + TraceMonkey;
var envJs = JsBrowser;
var harmony = johnson + envJs;
var jazzMoney = jasmine + harmony;
Install harmony by following instructions here: http://github.com/mynyml/harmony
Install JazzMoney
gem install jazz_money
Note that there is an issue with installing JazzMoney using bundler. The gem installs fine but when I invoke JM, I get a segfault in Johnson:
/Users/mag/.rvm/gems/ruby-1.8.7-p299@scratch/gems/johnson-2.0.0.pre3/lib/johnson/tracemonkey/tracemonkey.bundle: [BUG] Segmentation fault
ruby 1.8.7 (2010-06-23 patchlevel 299) [i686-darwin10.4.0]
Abort trap
The easiest way to run jasmine specs is to build a simple ruby file that can launch JazzMoney. If you are using the
jasmine gem, then the new, sexy way to do this is to piggy-back on your existing
jasmine.yml file. Check out this gist for an example. If you don’t have a jasmine.yml
file and don’t feel like running the jasmine gem’s generator to get one, here is the default one you get
if you run the generator. You must put this file in ‘spec/javascripts/support/jasmine.yml’ for JazzMoney (via the
jasmine gem) to pick it up.
YAML-haters can bypass the jasmine.yml file and build their file lists by hand. Here is an example
of doing just that.
You can put your runner file anywhere (for instance ‘ruby spec/javascript/run_jasmine_specs_with_jazz_money.rb’) and invoke
it with ‘ruby’. You can also put similar code into a rake task.
JazzMoney uses the RSpec runner to run your Jasmine specs. This means that if you pass options that RSpec recognizes,
they will be parsed and used. For instance, to see colored and nested output instead of the standard progress dots,
run jazz_money as so:
ruby spec/javascript/run_jasmine_specs_with_jazz_money.rb -f n -c
JazzMoney sets up a single window instance, and all your specs are run within that window. If you are using
the jasmine gem, your tests should run with little modification (except maybe your HTML fixture loading…see below).
If you need HTML fixtures, JazzMoney has an API for that:
beforeEach(function() {
JazzMoney.loadFixture("projects");
});
In the code above, a file named ‘spec/javascript/fixtures/projects.html’ will be loaded and its entire contents will
be dumped into the innerHTML of the body tag of the current window. You can add directory structure underneath the top
level fixtures dir if you like.
There is no support for loading CSS rules from an external file, but early indications are that env.js has some support
for CSS. Stay tuned.
JazzMoney doesn’t like prototype.js. On version 1.6.0.3, it somehow causes JSON.stringify to escape all double-quote
marks. We use JSON to transfer the entire suite definition over from json to ruby, and the ruby JSON parser doesn’t
like this and blows up with an error that looks like this:
/Library/Ruby/Gems/1.8/gems/json_pure-1.4.6/lib/json/common.rb:146:in `parse': 655: unexpected token at '"[{\"id\": 0, \"name\": \"Player\", \"type\": \"suite\", \"children\": [{\"id\": 0, \"name\": \"should be able to play a Song\", \"type\": \"spec\", \"children\": []}, {\"id\": 1, \"name\": \"when song has been paused\", \"type\": \"suite\", \"children\": [{\"id\": 1, \"name\": \"should indicate that the song is currently paused\", \"type\": \"spec\", \"children\": []}, {\"id\": 2, \"name\": \"should be possible to resume\", \"type\": \"spec\", \"children\": []}]}, {\"id\": 3, \"name\": \"tells the current song if the user has made it a favorite\", \"type\": \"spec\", \"children\": []}, {\"id\": 2, \"name\": \"#resume\", \"type\": \"suite\", \"children\": [{\"id\": 4, \"name\": \"should throw an exception if song is already playing\", \"type\": \"spec\", \"children\": []}]}]}]"' (JSON::ParserError)
from /Library/Ruby/Gems/1.8/gems/json_pure-1.4.6/lib/json/common.rb:146:in `parse'
from /Library/Ruby/Gems/1.8/gems/jazz_money-0.0.4/lib/jazz_money/runner.rb:33:in `call'
from spec/javascripts/run_jasmine_specs_with_jazz_money.rb:5
On prototype 1.6.1, I get a different error, and I have no clue what’s going on here:
xpath failure: ReferenceError: alert is not defined
/Library/Ruby/Gems/1.8/gems/envjs-0.2.0/lib/envjs/static.js:20097 [JavaScript]: alert is not defined (Johnson::Error)
from /Library/Ruby/Gems/1.8/gems/envjs-0.2.0/lib/envjs/static.js:20043 [JavaScript]
from /Library/Ruby/Gems/1.8/gems/envjs-0.2.0/lib/envjs/static.js:20552 [JavaScript]
from /Library/Ruby/Gems/1.8/gems/envjs-0.2.0/lib/envjs/static.js:20522 [JavaScript]
from /Library/Ruby/Gems/1.8/gems/envjs-0.2.0/lib/envjs/static.js:20487 [JavaScript]
from /Library/Ruby/Gems/1.8/gems/envjs-0.2.0/lib/envjs/static.js:20019 [JavaScript]
from /Library/Ruby/Gems/1.8/gems/envjs-0.2.0/lib/envjs/static.js:19941 [JavaScript]
from /Library/Ruby/Gems/1.8/gems/envjs-0.2.0/lib/envjs/static.js:19772:in `xPathStep' [JavaScript]
from /Library/Ruby/Gems/1.8/gems/envjs-0.2.0/lib/envjs/static.js:19777:in `xPathStep' [JavaScript]
... 21 levels...
from /Library/Ruby/Gems/1.8/gems/jazz_money-0.0.4/lib/jazz_money/jasmine_runner.rb:74:in `load_js_includes'
from /Library/Ruby/Gems/1.8/gems/jazz_money-0.0.4/lib/jazz_money/jasmine_runner.rb:35:in `start'
from /Library/Ruby/Gems/1.8/gems/jazz_money-0.0.4/lib/jazz_money/runner.rb:28:in `call'
from spec/javascripts/run_jasmine_specs_with_jazz_money.rb:5
If you clone the repo and want to run specs, that can be done with
spec spec/
Pull requests gladly accepted!
Copyright © 2008-2010 Pivotal Labs. This software is licensed under the MIT License.