2013-09-30 4 views
18

Je veux écrire des tests JS. Le code de production est écrit avec RequireJS. J'ai trouvé un test lib nommé Squire.js: https://github.com/iammerrick/Squire.js/Exemple Squire.js avec Jasmine et RequireJS

sur le site Web Squire.js

Run génère une fonction qui recevra un rappel et fait exécuter après votre fonction de test est terminée. Particulièrement utile pour les frameworks où l'asynchronisme est géré avec un callback. Voici un exemple avec Mocha.js. Jasmine peut offrir cette approche de rappel à l'aide Jasmin.Async. »

Je ne sais pas comment l'utiliser avec Jasmine async. Un petit exemple serait très utile.

Répondre

21

C'est une installation agréable pour l'insertion . modules avec dépendances chinés dans des tests Ceci est un exemple de bout en bout pour obtenir quelqu'un a commencé, sauter à la fin si vous voulez juste voir la spécification

Structure des dossiers.

Jasmine 
|-lib 
||-jasmine   -- Contains all the Jasmine files 
|||-boot.js 
|||-jasmine-html.js 
|||-jasmine.js 
|||-jasmine.css 
|||-jasmine_favicon.png 
|||-... 
|-spec    -- Spec files go here 
||-hello-spec.js 
|SpecRunner.html 
|SpecRunner.js 
|squire.js 
Scripts 
|knockout.js 
|require.js 
|jquery.js 
App 
|-hello.js 
|-foo.js 

Au moment de poser votre question, Jasmine 1.3 était la dernière version. Depuis lors 2.0 a été libéré et contient quelques améliorations asynchrones. Les deux versions sont incluses ici, 1.3 est commenté.

SpecRunner.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
    <title>Hello Spec Runner</title> 

    <link rel="shortcut icon" type="image/png" href="lib/jasmine/jasmine_favicon.png"> 
    <link rel="stylesheet" type="text/css" href="lib/jasmine/jasmine.css"> 
</head> 
<body> 
    <!-- Load RequireJS & the testsuite --> 
    <script src="../Scripts/require.js" data-main="SpecRunner.js" type="text/javascript" ></script> 
</body> 
</html> 

SpecRunner.js:

Cette question Does Jasmine 2.0 really not work with require.js? utile à obtenir cette place et en cours d'exécution.

(function() { 
    'use strict'; 

    // Configure RequireJS to shim Jasmine 
    requirejs.config({ 
     baseUrl: "../App", 
     paths: { 
      'jasmine' : '../Jasmine/lib/jasmine/jasmine', 
      'jasmine-html': '../Jasmine/lib/jasmine/jasmine-html', 
      'boot': '../Jasmine/lib/jasmine/boot', // This is not present in Jasmine 1.3 
      'spec' : '../Jasmine/spec', 
      'squire': '../Jasmine/squire', 
      'knockout': '../Scripts/knockout-2.3.0', 
      'jquery': '../Scripts/jquery-1.10.2' // This only used in the Jasmine 1.3 case. 
     }, 
     shim: { 
      'jasmine': { 
       exports: 'jasmine' 
      }, 
      'jasmine-html': { 
       deps: ['jasmine'], 
       exports: 'jasmine' 
      }, 
      'boot': { 
       deps: ['jasmine', 'jasmine-html'], 
       exports: 'jasmine' 
      }, 
      "squire": { 
       exports: "squire" 
      } 
     } 
    }); 

    // Define all of your specs here. These are RequireJS modules. 
    var specs = [ 
     'spec/hello-spec' 
    ]; 

    // Load Jasmine - This will still create all of the normal Jasmine browser globals unless `boot.js` is re-written to use the 
    // AMD or UMD specs. `boot.js` will do a bunch of configuration and attach it's initializers to `window.onload()`. Because 
    // we are using RequireJS `window.onload()` has already been triggered so we have to manually call it again. This will 
    // initialize the HTML Reporter and execute the environment. 
    require(['boot'], function() { 

     // Load the specs 
     require(specs, function() { 

      // Initialize the HTML Reporter and execute the environment (setup by `boot.js`) 
      window.onload(); 
     }); 
    }); 

    /****** 
    * Use this require if you're on Jasmine 1.3 
    ******/ 
    //require(['jquery', 'jasmine-html'], function ($, jasmine) { 
    // var jasmineEnv = jasmine.getEnv(); 
    // jasmineEnv.updateInterval = 1000; 

    // var htmlReporter = new jasmine.HtmlReporter(); 

    // jasmineEnv.addReporter(htmlReporter); 

    // jasmineEnv.specFilter = function(spec) { 
    //  return htmlReporter.specFilter(spec); 
    // }; 

    // $(function() { 
    //  require(specs, function(spec) { 
    //   jasmineEnv.execute(); 
    //  }); 
    // }); 
    //}); 

    // end 1.3 
})(); 

foo.js:

define(['knockout'], function (ko) { 

    var message = ko.observable("Go away, World!"); 

    return { 
     message: message() 
    }; 
}); 

hello.js:

define(['foo'], function (foo) { 

    return { 
     message : foo.message 
    }; 

}); 

hello-spec.js:

define(['squire'], function (Squire) { 

    var injector = new Squire(); 
    var builder = injector 
     .mock('foo', { 
       message: "Hello, World!" 
     }); 

    describe('hello', function() { 
     var hello; 

     beforeEach(function (done) { 
      // For async: 
      // accept a "done" parameter and Jasmine will wait... 
      builder.require(['hello'], function (hi) { 
       hello = hi; 
       done(); // ...until you invoke it. 
      }); 

      /******* 
      * Use the following if you're on 1.3 
      *********/ 
      //var done; 
      //runs(function() { 
      // builder.require(['hello'], function (hi) { 
      //  hello = hi; 
      //  done = true; 
      // }); 
      //}); 

      //waitsFor(function() { 
      // return done; 
      //}, "Unable to load dependency not loaded", 750); 

      // end 1.3 
     }); 

     it('is welcoming', function() { 
      expect(hello.message).toBe("Hello, World!"); 
     }); 
    }); 

    describe('hello no mock foo', function() { 
     var hello; 

     beforeEach(function (done) { 
      // For async: 
      // accept a "done" parameter and Jasmine will wait... 
      require(['hello'], function (hi) { 
       hello = hi; 
       done(); // ...until you invoke it. 
      }); 

      /******* 
      * Use the following if you're on 1.3 
      *********/ 
      //var done; 
      //runs(function() { 
      // require(['hello'], function (hi) { 
      //  hello = hi; 
      //  done = true; 
      // }); 
      //}); 

      //waitsFor(function() { 
      // return done; 
      //}, "Unable to load dependency not loaded", 750); 

      // end 1.3 
     }); 

     it('is less than welcoming', function() { 
      expect(hello.message).toBe("Go away, World!"); 
     }); 
    }); 
}); 

Détails

Lignes

var injector = new Squire(); 
var builder = injector 
    .mock('foo', { 
     message: "Hello, World!" 
    }); 

dépendance de maquette bonjour sur foo puis

builder.require(['hello'], function (hi) { 
    hello = hi; 
    done(); // ...until you invoke it. 
}); 

charge le module bonjour en utilisant le foo moqué. Comparaison à l'aide elle-même besoin pour charger bonjour dans le second test:

require(['hello'], function (hi) { 
    hello = hi; 
    done(); // ...until you invoke it. 
}); 

Le Jasmine docs http://jasmine.github.io/ peut vous remplir la fonctionnalité "done()" (2.0) ou "court/waitsFor" (1.3).