在angular.js教程中,我找到了一个工厂测试的例子:
模块:
angular.module('omdbModule', [])
.factory('omdbApi', function omdbApiFactory() {
return {
search: function() {
//logic to get data return movieData;
}
}
测试(可以通过两种方式进行:使用'$ provide'作为参数传递匿名函数:
angular.mock.module(function($provide){
$provide.factory('omdbApi', function(){
return{
search:function(query){
return movieData;
}
}
});
或仅使用对象文字:
angular.mock.module({
'omdbApi':{
{ search:function(query){
return movieData;
}
}
});
在这两种情况下我都不明白为什么必须在模拟中重新定义搜索功能,而不是仅仅获取工厂然后自动访问其所有属性和方法。我认为在模拟中定义整个工厂是好的,以防它在模块中不存在,但为什么在模块及其工厂已经定义并且它们确实存在时就完成了?
答案 0 :(得分:0)
模拟服务的一个原因是为了防止需要固定装置(非$http
XHR请求,DOM操作)或移动部件过多的不良操作。
另一个好理由是防止测试交叉污染。如果单元A中断,开发人员可能想知道究竟是什么坏了。如果B和C单元测试也是红色的话会变得更难,所以应该按照面包屑来判断问题制作者是否是A.如果面包屑停止并且最终调试app和specs而不是修复它会变得更难并且去工作。
除非测试对象要测试多个单元(这是集成测试,它是对单元测试的补充而不是替换它们),否则请单独测试每个单元。