【发布时间】:2016-04-09 08:10:26
【问题描述】:
在 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;
}
}
});
在这两种情况下,我都不明白为什么必须在模拟中重新定义搜索功能,而不是仅仅获取工厂,然后自动访问其所有属性和方法。我认为在一个模拟中定义整个工厂是好的,以防它在模块中并不真正存在,但是为什么在模块及其工厂已经定义并且它们确实存在时这样做呢?
【问题讨论】:
-
这可能不是对服务本身的测试,而是对使用该服务的组件的测试。并且该服务被存根以返回众所周知的虚假数据。也就是说,只需监视真实的服务就可以达到同样的目的。
-
你确认没有必要重新定义整个工厂及其方法已经定义了吗?
-
此代码完全脱离上下文发布。所以我只能猜测作者为什么这样做。如果是测试服务本身,对我来说没有多大意义。如果要根据服务来测试组件,这是有道理的,但我通常使用 spy 来代替。但如果没有任何上下文,我可能会错过一个重要的难题。
-
好的,只是间谍已经是一个足够的解决方案,现在我想我的问题代码中显示的技术对于模拟不存在的组件很有用。
-
我找到了另一个很好的例子,当它需要通过模拟来重写已经存在的工厂时(或存根,我仍然不太了解区别):thejsguy.com/2015/01/28/…
标签: angularjs angularjs-ngmock