2013-10-08 19 views
29

Jasmine + RequireJs'nin daha önceki sürüm adaylarıyla olduğu gibi benim SpecRunner.html/.js, RequireConfig.js, yollarım ve benim şimlerimi ayarlıyorum, ancak şimdi test yöntemlerim Jasmine'i tanımsız gösteriyor. Yakın zamanda, RequireJs ile uyumsuz olduğunu anladığım farklı bir Jasmine yükleme yöntemi olarak değiştirdiler.Jasmine 2.0 gerçekten require.js ile çalışmıyor mu?

Anlayışım doğru mu? Eğer öyleyse, Jasmine + RequireJs'i tekrar kullanabilir miyiz?

cevap

68

Yeni boot.js, başlatma işleminin bir demetini yapar ve daha önce require.js'nin Jasmine'i yüklediği zamana göre çağrılmış olan window.onload() öğesine ekler. HTML Muhabirini başlatmak ve ortamı yürütmek için window.onload() öğesini elle çağırabilirsiniz.

SpecRunner.html

<!doctype html> 
<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <title>Jasmine Spec Runner v2.0.0</title> 

    <link rel="shortcut icon" type="image/png" href="lib/jasmine-2.0.0/jasmine_favicon.png"> 
    <link rel="stylesheet" type="text/css" href="lib/jasmine-2.0.0/jasmine.css"> 

    <!-- specRunner.js runs all of the tests --> 
    <script data-main="specRunner" src="../bower_components/requirejs/require.js"></script> 
    </head> 
    <body> 
    </body> 
</html> 

specRunner.js

(function() { 
    'use strict'; 

    // Configure RequireJS to shim Jasmine 
    require.config({ 
    baseUrl: '..', 
    paths: { 
     'jasmine': 'tests/lib/jasmine-2.0.0/jasmine', 
     'jasmine-html': 'tests/lib/jasmine-2.0.0/jasmine-html', 
     'boot': 'tests/lib/jasmine-2.0.0/boot' 
    }, 
    shim: { 
     'jasmine': { 
     exports: 'window.jasmineRequire' 
     }, 
     'jasmine-html': { 
     deps: ['jasmine'], 
     exports: 'window.jasmineRequire' 
     }, 
     'boot': { 
     deps: ['jasmine', 'jasmine-html'], 
     exports: 'window.jasmineRequire' 
     } 
    } 
    }); 

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

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

Örnek Spec

define(['router'], function(router) { 
    'use strict'; 

    describe('router', function() { 
    it('should have routes defined', function() { 
     router.config({}); 
     expect(router.routes).toBeTruthy(); 
    }); 
    }); 
}); 
+0

Bu cevap için teşekkür ederiz. Çalışmaya çalışırken bir öğleden sonra geçirdim. – keepitreal

+0

Sadece bunun üzerine tökezledim ve harika çalışıyor! Hatta 'boot.js' dosyasını değiştirerek ve seçmemin div'ına yükleyerek bir görünüme ekledim. – Josh

+1

Dostum, çok teşekkürler! Sonsuza dek uğraştım ve bu beni anında başlattı. – medoingthings

13

İşte bazı durumlarda basit olabilecek alternatif bir yaklaşım - yüklemek için Jasmine's asynchronous support kullanmak senin Testleri gerçekleştirmeden önce AMD modülü, şu şekilde:

yılında MySpec.js: Bunun için

describe('A suite', function() { 
    var myModule; 

    // Use require.js to fetch the module 
    it("should load the AMD module", function(done) { 
    require(['myModule'], function (loadedModule) { 
     myModule = loadedModule; 
     done(); 
    }); 
    }); 

    //run tests that use the myModule object 
    it("can access the AMD module", function() { 
    expect(myModule.speak()).toBe("hello"); 
    }); 
}); 

Eğer (muhtemelen sizin SpecRunner.html içinde require.js ve configure require dahil etmek gerekir, çalışmak için her zamanki gibi, örneğin

SpecRunner.html yılında: Bu gibi baseURL) ayarlayarak

<!DOCTYPE HTML> 
<html> 
    <head> 
    <meta charset="UTF-8"> 
    <title>Jasmine Spec Runner v2.0.0</title> 

    <link rel="shortcut icon" type="image/png" href="lib/jasmine-2.0.0/jasmine_favicon.png"> 
    <link rel="stylesheet" type="text/css" href="lib/jasmine-2.0.0/jasmine.css"> 

    <script src="lib/require.min.js"></script> 
    <script> require.config({ baseUrl: "src" }); </script> 

    <script src="lib/jasmine-2.0.0/jasmine.js"></script> 
    <script src="lib/jasmine-2.0.0/jasmine-html.js"></script> 
    <script src="lib/jasmine-2.0.0/boot.js"></script> 

    <script src="spec/MySpec.js"></script> 

    </head> 
    <body> 
    </body> 
</html> 

Bu örnek için, AMD modülü uygulama aşağıdaki gibi görünebilir:

src/MyModule .js:

İşte
define([], function() { 
    return { 
    speak: function() { 
     return "hello"; 
    } 
    }; 
}); 

birvar 210.

+0

Sizin Plunker bir mücevher! Teşekkürler – HockeyJ

+1

Alternatif olarak, her bir özellikten önce çalışacak şekilde beforeEach() işlevinde done() öğesini de kullanabilirsiniz. Ardından, her bir özelliği, modül yükleme özelliklerinin çalıştırılmasını gerektirmeden ayrı ayrı çalıştırabilirsiniz. –

İlgili konular