2014-02-12 158 views
8

可以說我有定義爲如何嘲笑模塊角測試

var app = angular.module('app',[dependenceny1Module,dependenceny2Module,dependenceny3Module......]) 

的角模塊,其中應用程序是取決於散裝其它模塊的模塊。 現在進行單元測試,我可以嘲笑使用

mock('app') 

的模塊,但我必須爲所有的獨立模塊模擬模塊,如下面

mockDependency1 = angular.module('dependency1Module') 
mockDependency1 = angular.module('dependency2Module') 

,或者有加載所有含有這些模塊的腳本文件。

我想知道什麼是最好的方法來嘲笑這裏的依賴模塊?特別是當依賴模塊太多時。

+0

在測試過程中加載其他模塊時出現了什麼問題?誠實的問題,也許你的環境導致問題?您還有哪些其他工具用於測試?噶?咕嚕?茉莉花? –

+0

您是否在「構建」過程中進行測試?你在網頁上測試自己嗎?託管的規格文件? –

回答

8

調查requireJs加載您的依賴關係。使用RequireJs,您可以爲生產代碼和測試代碼加載不同的文件。

這是一個(基本的)例子。

比方說,你有一個JavaScript文件,定義您的角模塊(命名如app.js):

define(['dependency1Module', 'dependency2Module'], function(dependency1Module, dependency2Module) { 
    var app = angular.module('app',['dependenceny1Module', 'dependenceny2Module']); 
    return app; 
} 

模塊dependency1Module,dependency2Module,......有一個類似的設置:

define(function() { 
    var module = angular.module('dependenceny1Module'); 
    return module; 
} 

現在你需要一個引導文件(例如命名爲bootstrap.js)來定義文件的位置,所以你將有兩個引導文件:一個是你的生產代碼(使用可能的縮小版本一些庫)和用於測試版本:

require.config({ 
    baseUrl: "path/to/production|test scripts", 
    paths: { 
    angular: 'path/to/angular', 
    jquery: 'path/to/jquery', 
    }, 
    shim: { 
    angular: { 
     exports: 'angular', 
     deps: ['jquery'] 
    } 
    } 
}); 

require(["angular", "app", ], function(angular, app) { 
    angular.element(document).ready(function() { 
    angular.bootstrap(document, ['app']); 
    }); 
}); 

而是改變baseUrl,你可以定義爲模塊不同的路徑要嘲笑:

paths: { 
    dependency1Module: 'path/to.mock/dependency1Module' 
} 

最後一步是將插件引導文件在您的html代碼(生產或測試):

<script type="text/javascript" src="path/to/require.js"></script> 
<script type="text/javascript" src="path/to/bootstrap(production|test).js"></script> 

這是一個基本的requirejs設置。當然,在你使用某種角度類型(例如控制器,服務,...)之前,你還需要爲它設置一個requirejs模塊(並且require它就是你的app.js)。

+0

我只是因爲RequireJS而喜歡這個答案...但是,我不確定OP想要解決什麼問題。爲什麼他不能參考其他文件?也許他不能引用requirejs?測試在哪裏運行? etc. –

+1

如果你的產品需要'dependency1Module.js',但你想在所有的測試中使用'mock-Dependency1Module.js',那麼你可以在你的'karma.config中包含'mock-Dependency1Module.js'這個文件。 js'而不是真正的文件。我認爲爲了測試/模擬而將RequireJs添加到項目中可能有點矯枉過正。 – Sylvain

0

這一切都取決於你真正想測試的東西,如果你是單元測試你想要儘可能少加載/模擬。例如,如果你單元測試一個控制器,你可以模擬這個模塊,只加載/模擬它使用的任何依賴關係。

1

模塊化您自己的應用程序將有所幫助。

如果你的程序是這樣的:

var app = angular.module('app',[dependenceny1Module, dependenceny2Module, dependenceny3Module......]) 

,並含有50之類的東西過濾器,指令和控制器。其中一些依賴於depenny1Module,其中一些依賴於dependency2Module。

根據他們的職責和依賴性將他們分開。

var mymodule1 = angular.module('mymodule1',[dependenceny2Module, dependenceny3Module]) 

var mymodule2 = angular.module('mymodule2',[dependenceny1Module,]) 

然後,讓你的應用程序依賴於您自己的模塊:

var app = angular.module('app',[ mymodule1, mymodule2]) 

app應該大多已啓動代碼。

現在,當你想測試的mymodule2controller13,你只會有嘲笑mymodule2的依賴如果該模塊具有依賴關係。所以測試套件不會加載app,它們只會加載它們測試的模塊。

this example凡爲mymodule1MyMainCtrl1測試只關心從external1s1即使app整體取決於external1external2external3