2013-09-30 6 views
18

Chcę napisać testy JS. Kod produkcyjny jest napisany w RequireJS. znalazłem lib testowy o nazwie Squire.js: https://github.com/iammerrick/Squire.js/Przykład Squire.js z Jasmine i RequireJS

od Squire.js stronie

Run generuje funkcję, która otrzyma zrobić zwrotnego i wykonać go po czynność test jest kompletny. Szczególnie przydatne w frameworkach, w których asynchrony są obsługiwane za pomocą wywołania zwrotnego. Oto przykład z Mocha.js. Jaśmin może zaoferować tej metody wywołania zwrotnego używając Jasmin.Async.”

nie wiem jak tego używać z Jasmine async. Mały przykład byłby bardzo przydatny.

Odpowiedz

21

To jest ładny setup do wrzucania . moduły z wyśmiewany zależności język testów jest to przykład zakończyć do końca, aby ktoś zaczął, przejdź do końca, jeśli tylko chcą zobaczyć spec Struktura

Folder.

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 

W chwili Twojego pytania, Jasmine 1.3 była najnowszą wersją. Od tego czasu wydano wersję 2.0 i zawiera kilka ulepszeń asynchronicznych. Obydwie wersje znajdują się tutaj, 1.3 jest wykomentowane.

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:

To pytanie Does Jasmine 2.0 really not work with require.js? był pomocny w uzyskaniu tego uruchomiony.

(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 
    }; 

}); 

Cześć-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!"); 
     }); 
    }); 
}); 

Szczegóły

Linie

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

zależność makiety cześć w sprawie foo, a następnie

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

ładuje moduł komentarzy pomocą szydzili foo. Porównaj z użyciem wymaga się załadować komentarzy w drugim teście:

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

Jasmine docs http://jasmine.github.io/ może wypełnić Ci na "done()" funkcji (2.0) lub "Płynie/waitsFor" (1.3).