Skip to end of metadata
Go to start of metadata

An optional parameter to the Grunt-Sauce task is OnTestComplete, a callback that is called at the end of every test, before results are logged to the console. You can use this callback to intercept results from SauceLabs and re-report the results (or use the information for your own purposes).

This parameter takes two arguments (result, callback)result is the JavaScript object exposed to Sauce Labs as the results of the test. callback must be called, node-style (having arguments errresult, where result is a true/false boolean which sets the test result reported to the command line)

When running the tests for this project, you need to test the case where a test fails on Sauce. In that case, you want to record a test Failure as a Success for us.

'saucelabs-qunit': {
  all: {
    options: {
      username: 'saucelabs-user-name', // if not provided it'll default to ENV SAUCE_USERNAME (if applicable)
      key: 'saucelabs-key', // if not provided it'll default to ENV SAUCE_ACCESS_KEY (if applicable)
      urls: ['', ''],
      build: process.env.CI_BUILD_NUMBER,
      testname: 'Sauce Unit Test for',
      browsers: [{
        browserName: 'firefox',
        version: '19',
        platform: 'XP'
      onTestComplete: function(result, callback) {
        // Called after a unit test is done, per page, per browser
        // 'result' param is the object returned by the test framework's reporter
        // 'callback' is a Node.js style callback function. You must invoke it after you
        // finish your work.
        // Pass a non-null value as the callback's first parameter if you want to throw an
        // exception. If your function is synchronous you can also throw exceptions
        // directly.
        // Passing true or false as the callback's second parameter passes or fails the
        // test. Passing undefined does not alter the test result. Please note that this
        // only affects the grunt task's result. You have to explicitly update the Sauce
        // Labs job's status via its REST API, if you want so.

        // The example below negates the result, and also updates the Sauce Labs job's status
        var user = process.env.SAUCE_USERNAME;
        var pass = process.env.SAUCE_ACCESS_KEY;
            url: ['', user, 'jobs', result.job_id].join('/'),
            auth: { user: user, pass: pass },
            json: { passed: !result.passed }
        }, function (error, response, body) {
          if (error) {
          } else if (response.statusCode !== 200) {
            callback(new Error('Unexpected response status'));
          } else {
            callback(null, !result.passed);


  • No labels