2012-12-03 58 views

回答

2

如何define工作

我用require.js的實施和測試。您可以使用define加載任何JavaScript文件作爲之前的模塊函數的執行。

define(["test/myTest.js", "test/anotherTest.js"], function(test1, test2) { 
    // perform your tests 
}); 

如何使用requirejs與asyncTests

您也可以後依賴加載使用require模塊功能加載代碼。我用它QUnit。以下是我的代碼示例。

首先,確保默認停止QUnit測試運行器(這與其他測試框架類似)。這樣,您可以定義何時運行測試(即加載相關代碼之後)。

QUnit.config.autostart = false

其次,定義您的測試作爲一個模塊。該模塊加載依賴關係,然後定義測試,然後加載要測試的代碼。這隻有在代碼是自執行的時候纔有必要,並且不能事先加載(在這種情況下,你可以直接使用define並使用它)。這裏是我使用Chaplin庫(用CoffeeScript編寫)的例子。

define(['chaplin'], function(chaplin) { 
    asyncTest("publish startup complete event", function() { 
    chaplin.mediator.subscribe("startup~complete", function() { 
     ok(true, "startup~complete event fired"); 
    }); 
    return requirejs(['modules/startup/startup'], function() { 
     start(); 
    }); 
    }); 
}); 

重要的部分是最後的requirejs調用。在定義測試之後,它加載要測試的代碼。

動態加載依賴性

EDIT:響應評論 假設存在一個稱爲config模塊包含配置數據。我也假設一定的格式,所以如果你的格式不同,你可能會做一些小的改變。原則雖然如此。

define(["config"], function(config) { 
    // assuming config.modules is an array of all development modules, 
    // config.devPath is the base bath to development modules, 
    requirejs(
    config.modules.map(function(module){ 
     return config.devPath + module 
    }) 
    , function() { 
    // all modules loaded, now go on 
    // however, no reference to modules left, so need to work with `arguments` array 
    }); 
}); 

但是,您應該知道您在回調函數中丟失了對模塊的引用。

+0

是的,很酷,我能做些什麼,如果'config'模塊包含我要從中加載文件的主機,作爲依賴項? – ValeriiVasin

+0

請確認:您有一個名爲'config'的模塊,其中包含其他模塊的主機地址(url)?所以從某種意義上說,你正試圖動態加載你的依賴關係? – davidpfahler

+0

是的,不同的主機:生產/測試等 – ValeriiVasin