2014-02-12 156 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