karma-runner/karma

View on GitHub
docs/plus/08-emberjs.md

Summary

Maintainability
Test Coverage
---
pageTitle: Ember.js
menuTitle: Ember.js
---

To execute javascript unit and integration tests with ember.js follow the steps below:

1. [install karma]

2. install the qunit plugin

   ```bash
   npm install karma-qunit --save-dev
   ```

3. install the ember preprocessor plugin

   ```bash
   npm install karma-ember-preprocessor --save-dev
   ```

4. generate a configuration file for karma
   ```bash
   karma init
   ```
   note -the above will walk you through the basic setup. An example configuration file that works with ember.js/qunit and phantomjs is below

   ```javascript
   module.exports = function(config) {
     config.set({
       basePath: 'js',
 
       files: [
         'vendor/jquery/jquery.min.js',
         'vendor/handlebars/handlebars.js',
         'vendor/ember/ember.js',
         'app.js',
         'tests/*.js',
         'templates/*.handlebars'
       ],
 
       browsers: ['PhantomJS'],
       singleRun: true,
       autoWatch: false,
 
       frameworks: ['qunit'],
 
       plugins: [
         'karma-qunit',
         'karma-ember-preprocessor',
         'karma-phantomjs-launcher'
       ],
 
       preprocessors: {
         '**/*.handlebars': 'ember'
       }
     });
   };
   ```

   Note - the `files` section above should include all dependencies, ie- jQuery/handlebars/ember.js along with the js and handlebars files required to deploy and run your production ember.js application

   Note - when testing ember applications, it is important that karma does not try to run the tests until the ember application has finished initialization. You will need to include a small bootstrap file in the `files` section above to enforce this.  Here's an example:
   ```javascript
   __karma__.loaded = function() {};
 
   App.setupForTesting();
   App.injectTestHelpers();
 
   //this gate/check is required given that standard practice in Ember tests to is to call
   //Ember.reset() in the afterEach/tearDown for each test.  Doing so, causes the application
   //to 're-initialize', resulting in repeated calls to the initialize function below
   var karma_started = false;
   App.initializer({
       name: "run tests",
       initialize: function(container, application) {
           if (!karma_started) {
               karma_started = true;
               __karma__.start();
           }
       }
   });
   ```

5. add a simple Qunit test

   ```javascript
   test('one should equal one', function() {
       equal(1, 1, 'error: one did not equal one');
   });
   ```

6. run the tests with karma from the command line
   ```bash
   karma start
   ```

A simple unit / integration tested example app showing karma / qunit / ember in action can be found [here]

[install karma]: ../intro/installation.html
[here]: https://github.com/toranb/ember-testing-example