Javascript 使用Jasmine在Angular controller中测试对象初始化

Javascript 使用Jasmine在Angular controller中测试对象初始化,javascript,angularjs,jasmine,Javascript,Angularjs,Jasmine,我有一个控制器,它在初始化控制器时初始化一个对象,并想测试它是否是用实际调用它的特定参数调用的 我知道我可以测试$scope.autoSaveObj的某些属性,这些属性会告诉我它实际上已初始化,但是我如何监视初始化事件本身呢 本质上,我想监视新的autoSaveObj,就像监视一个方法一样 我想测试和监视对象构造函数的主要原因是,我的karma coverage插件将显示这些行。如果我只是在初始化后测试$scope.autoSaveObject的状态,它将不会显示包含的行 App.control

我有一个控制器,它在初始化控制器时初始化一个对象,并想测试它是否是用实际调用它的特定参数调用的

我知道我可以测试$scope.autoSaveObj的某些属性,这些属性会告诉我它实际上已初始化,但是我如何监视初始化事件本身呢

本质上,我想监视新的autoSaveObj,就像监视一个方法一样

我想测试和监视对象构造函数的主要原因是,我的karma coverage插件将显示这些行。如果我只是在初始化后测试$scope.autoSaveObject的状态,它将不会显示包含的行

App.controller('ItemCtrl',[ '$scope', function($scope){
  $scope.autoSaveObject = new autoSaveObj({
    obj: $scope.item,
    saveCallback: function() {
                  return $scope.saveItem();
                },
    errorCallback: null,
    saveValidation: $scope.validItem,
    delay: 2000
  });
}]);

我猜代码示例是一个局部控制器,因为使用了
$scope
中的属性,而这些属性在这里没有初始化

因为autoSaveObj没有在任何地方定义,所以我假设它是一个全局函数。考虑将此移动到服务或工厂。 下面的示例演示如何

  • 模拟
    autoSaveObj
  • 验证调用参数,并
  • 验证创建的实例实际上是正确类型的实例
angular.module('myApp',[])。
控制器('ItemCtrl',函数($scope,$window){
//使用注入的$window对象,因此我们不依赖
//环境和它很容易被模仿。
$scope.autoSaveObject=new$window.autoSaveObj({
obj:$scope.item,
saveCallback:function(){
返回$scope.saveItem();
},
errorCallback:null,
saveValidation:$scope.validItem,
延迟:2000
});
});
描述('ItemCtrl',函数(){
var$控制器;
var$范围;
var$窗口;
无功控制器;
每个之前(模块('myApp',函数($provide)){
$window={
//创建一个可以监视的实际函数。
//使用jasmine.createSpy将不允许将其用作构造函数。
autoSaveObj:函数autoSaveObj(){}
};
//提供模拟的$窗口。
$provide.value(“$window”,“$window”);
}));
beforeach(注入函数($controller_$rootScope){
$controller=$controller;
$scope=$rootScope.$new();
}));
它('应该实例化autoSaveObj',函数(){
spyOn($window,'autoSaveObj');
//在函数中初始化控制器,以便
//做准备。
initController();
//像平常一样执行函数调用期望。
期望($window.autoSaveObj).toHaveBeenCalledWith(jasmine.objectContaining)({
saveCallback:jasmine.any(函数),
延迟:2000
}));
//autoSaveObject是autoSaveObj的一个实例,
//因为使用的是spyOn,而不是jasmine.createSpy。
预期($scope.autoSaveObject instanceof$window.autoSaveObj).toBe(true);
});
函数initController(){
控制器=$controller('ItemCtrl'{
$scope:$scope
});
}
});

我忘了将autoSaveObject作为依赖项注入,是的,这是一种对ctrl键的调低外观