Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Test your Rails application's JavaScript with the mocha test framework and chai assertion library
Ruby JavaScript CSS CoffeeScript HTML

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.


Matcha is a Rails engine that allows you to test your JavaScript with the mocha test framework and chai assertion library.

It is similar to Jasmine and Evergreen, but does not attempt to be framework agnostic. By sticking with Rails, Matcha can take full advantage of features such as the asset pipeline and engines.


Add matcha to the :test and :development groups in the Gemfile:

group :test, :development do
  gem "matcha"

And then execute:

$ bundle

Or install it yourself as:

$ gem install matcha


Create a spec/javascripts directory and name the files in it with a _spec suffix. You can write the specs in either JavaScript or CoffeeScript, using a .js or extension respectively, like you would any other script asset.

Require the assets under test and any other dependencies using Sprockets directives. For example, suppose you wanted to test your cool JavaScript Array#sum method, which you placed in app/assets/javascripts/array_sum.js. Write the specs in JavaScript in the file spec/javascripts/array_sum_spec.js:

//= require array_sum

describe("Array#sum", function(){
  it("returns 0 when the Array is empty", function(){

  it("returns the sum of numeric elements", function(){

Or, if you prefer CoffeeScript, in spec/javascripts/

#= require array_sum

describe "Array#sum", ->
  it "returns 0 when the Array is empty", ->

  it "returns the sum of numeric elements", ->

The matcha:server rake task starts a server for your tests. You can go to the root page to run all specs (e.g. http://localhost:8888/), or a sub page to run an individual spec file (e.g. http://localhost:8888/array_sum_spec).

Alternatively, you can run the specs headlessly with the matcha:ci task.

Spec Helper

Since Matcha integrates with the asset pipeline, using setup helpers in your specs is easy. Just create a spec_helper.js or file in specs/javascripts and require it in your tests:

//= require spec_helper
//= require array_sum

describe("Array#sum", function(){

Directives and Asset Bundling

We suggest that you explicitly require just the assets necessary for each spec. In CI mode, Matcha will run each spec in isolation, and requiring things explicitly will help ensure your scripts don't accumulate hidden dependencies and tight coupling.

However, you are free to ignore this advice and require the entire application.js asset bundle in your specs or spec helper, or a bundled subset of assets. Requiring bundled assets works like it does in Rails development mode -- Matcha will detect the complete set of dependencies and generate a separate script tag for each one. You won't have to search through a many thousand line application.js bundle to debug a spec failure.


Matcha can be configured in an initializer, e.g. config/initializers/matcha.rb:

Matcha.configure do |config|
  config.spec_dir  = "spec/javascripts"
  config.interface = :bdd
  config.driver    = :selenium
end if defined?(Matcha)

The defined? check is necessary to avoid a dependency on Matcha in the production environment.

The spec_dir option tells Matcha where to find JavaScript specs. The interface option specifies the test interface used by Mocha (see below). driver names a Capybara driver used for the CI task (try :webkit, after installing capybara-webkit).

The values above are the defaults.

Test Interface and Assertions

Matcha includes a vendored copy of mocha.js and the chai assertion libraries.

By default, it will assume that you want to use Mocha's "BDD" test interface, which provides describe(), it(), before(), after(), beforeEach(), and afterEach(). If you want to use the TDD, Exports, or QUnit interfaces instead, set the interface configuration option in an initializer:

Matcha.configure do |config|
  config.interface = :tdd # Or :exports or :qunit
end if defined?(Matcha)

Matcha will make all three of chai's assertion styles available to you: expect, should, and assert. See the chai documentation for the details.


  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Added some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request


Copyright (c) 2012 John Firebaugh

MIT License (see the LICENSE file)

Portions: Copyright (c) 2009 Jonas Nicklas, Copyright (c) 20011-2012 TJ Holowaychuk, Copyright (c) 2011 Jake Luer See LICENSE file for details.

Something went wrong with that request. Please try again.