Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何模拟用于角度测试的模块_Javascript_Angularjs - Fatal编程技术网

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])