Angularjs 用jasmine spyOn对angular.extend函数进行单元测试

Angularjs 用jasmine spyOn对angular.extend函数进行单元测试,angularjs,jasmine,Angularjs,Jasmine,我有一个指令,在某些情况下,我使用 angular.extend(dist, src) 现在我想测试这个案例,并检查是否调用了angular.extend 我在试着用间谍 spyOn(angular, 'extend') 然后在测试中 expect(angular.extend).toHaveBeenCalled() 我一点也不确定我能做到,但我决定试一试 谢谢你的帮助 编辑: 这是我的测试,按照你的建议编辑 it('should create new scope and extend c

我有一个指令,在某些情况下,我使用

angular.extend(dist, src)
现在我想测试这个案例,并检查是否调用了angular.extend

我在试着用间谍

spyOn(angular, 'extend')
然后在测试中

expect(angular.extend).toHaveBeenCalled()
我一点也不确定我能做到,但我决定试一试

谢谢你的帮助

编辑:

这是我的测试,按照你的建议编辑

it('should create new scope and extend config if config is passed to directive', function() {
    var spy = jasmine.createSpy('extendSpy').and.callThrough();
    angular.extend = spy;
    timeout.flush();
    _.forEach(scope.accordionConfig, function(configItem) {
        if (configItem.config) {
            expect(angular.extend).toHaveBeenCalled();
        }
    });
});
在beforeach钩子中,我没有什么特别的东西,只是分配config,为rest测试创建一些其他准备,并编译指令

下面是我试图测试的link函数的一个片段

if (scope.format === 'directive') {
    if (scope.config) {
        newScope = $rootScope.$new();
        angular.extend(newScope, scope.config);
    }
    scope.content = $compile(scope.content)(newScope || scope);
}

console记录angular.extend的值在断言之前,它应该是jasmine.spy的一个实例,如果不是,则说明创建spy的方式有问题,我们需要更多的上下文,也许您的完整代码可以提供帮助。 我假设您在每个钩子之前的
钩子中的某个地方创建了钩子,还是在其他钩子之一上创建了钩子

请尝试以下代码:

var spy = jasmine.createSpy('extendSpy').and.callThrough();
angular.extend = spy;
expect(spy).toBeCalledWith(dist, src);

总体上看是合法的。您可能希望使用
toHaveBeenCalledWith(dist,src)
来断言调用的参数。和chain
andCallThrough()
如果正在测试的函数的其他部分实际上取决于
extend
的结果,我很乐意使用建议的选项,但测试一直失败。我假设angular.extend不被称为。。至少不是那个角度的例子。。如果可能的话,如果我在断言之前执行console.log(angular.extend),那么我有一个函数,而不是jasmine.spy实例。是的,我以前有过。让我在测试中尝试创建spy,它本身不起作用。。log给了我这个:log:function(){…}如果您还需要我的代码中的任何东西,只需编写。事实上,我不确定你需要什么,因为我创造了类似的间谍,除了这个,其他一切都很好。如果没有帮助,请考虑发布完整的代码。它不起作用,但有趣的是,控制台。log(间谍)也给了我日志:函数to…({…})我想继续聊天,以进一步讨论。