Javascript 如何模拟用于角度测试的模块
假设我有一个定义为Javascript 如何模拟用于角度测试的模块,javascript,angularjs,Javascript,Angularjs,假设我有一个定义为 var app = angular.module('app',[dependenceny1Module,dependenceny2Module,dependenceny3Module......]) 其中app是一个模块,它依赖于大部分其他模块。 现在,对于单元测试,我可以使用 mock('app') 但是我必须为所有依赖模块创建模拟模块,如下所示 mockDependency1 = angular.module('dependency1Module') mockDep
var app = angular.module('app',[dependenceny1Module,dependenceny2Module,dependenceny3Module......])
其中app是一个模块,它依赖于大部分其他模块。
现在,对于单元测试,我可以使用
mock('app')
但是我必须为所有依赖模块创建模拟模块,如下所示
mockDependency1 = angular.module('dependency1Module')
mockDependency1 = angular.module('dependency2Module')
或者我必须加载包含这些模块的所有脚本文件
我想知道在这里模拟依赖模块的最佳方法是什么?尤其是当依赖模块太多时。查看以加载依赖项。使用RequireJs,您可以为生产代码和测试代码加载不同的文件
下面是一个(基本)示例
假设您有一个javascript文件,其中定义了角度模块(名为app.js
):
模块dependency1模块,dependency2模块。。。具有类似的设置:
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代码中插入引导文件(生产或测试):
这是一个基本的requirejs设置。当然,在您可以使用某个角度类型(例如控制器、服务等)之前,您还需要为它设置一个requirejs模块(并且
需要它,例如在app.js
中).这完全取决于您实际想要测试的内容,如果您正在进行单元测试,那么您希望加载/模拟的内容尽可能少。例如,如果您对控制器进行单元测试,您将模拟模块,并且只加载/模拟模块使用的任何依赖项。模块化您自己的应用程序将有所帮助
如果您的应用程序如下所示:
var app = angular.module('app',[dependenceny1Module, dependenceny2Module, dependenceny3Module......])
它包含50个东西,比如过滤器、指令和控制器。其中一些依赖于dependency1模块,另一些依赖于dependency2模块
根据他们的责任和依赖性将他们分开
var mymodule1 = angular.module('mymodule1',[dependenceny2Module, dependenceny3Module])
var mymodule2 = angular.module('mymodule2',[dependenceny1Module,])
然后让您的应用程序依赖于您自己的模块:
var app = angular.module('app',[ mymodule1, mymodule2])
你的应用程序
应该主要包含引导代码
现在,当您想测试mymodule2
的controller13
时,如果模块有依赖项,您只需模拟mymodule2
的依赖项。因此测试套件不会加载应用程序
,它们只会加载它们测试的模块
查看mymodule1
的MyMainCtrl1
测试只关心external1
中的s1
,即使app
作为一个整体依赖于external1
、external2
和external3
,测试期间加载其他模块有什么问题?诚实的问题,可能是您的环境导致了问题?您还使用了哪些其他工具进行测试?Karma?Grunt?Jasmine?您是否在“构建”过程中进行测试?您是否在您的网页上进行测试?托管的规范文件?我喜欢这个答案只是因为RequireJS…但是,我不确定OP仍在试图解决什么问题。为什么他不能引用其他文件?也许他也不能引用RequireJS?测试在哪里运行?等等。如果您的产品需要dependency1Module.js
但是如果您想在所有测试中使用mock-Dependency1Module.js
,那么您可以在karma.config.js
中包含mock-Dependency1Module.js
该文件,而不是真正的文件。我认为为了测试/模拟而向项目添加RequireJs可能有点过头了。
var mymodule1 = angular.module('mymodule1',[dependenceny2Module, dependenceny3Module])
var mymodule2 = angular.module('mymodule2',[dependenceny1Module,])
var app = angular.module('app',[ mymodule1, mymodule2])