Jasmine spyOn 函数和返回对象
Posted
技术标签:
【中文标题】Jasmine spyOn 函数和返回对象【英文标题】:Jasmine spyOn on function and returned object 【发布时间】:2016-05-12 11:08:54 【问题描述】:我正在使用带有 Angular 的 MeteorJS 并想测试控制器。我的控制器使用 $reactive(this).attach($scope)。我需要检查一下,是否调用了这个方法。
我为间谍创建了类似的东西:
var $reactive = function(ctrl)
return
attach:function(scope)
;
所以我可以这样称呼它:
$reactive('aaa').attach('bbb');
如何在测试中做到这一点?
spyOn($reactive, 'attach');
不起作用。我得到错误:attach() 方法不存在
以及如何检查它是否被调用? 这是个好电话吗?
expect($reactive).toHaveBeenCalledWith(controller);
以及如何检查是否使用 args(范围)调用了函数 attach?
【问题讨论】:
看起来$reactive
返回一个包含附加方法的对象,对吧?并且你想测试这个 attach
方法是否被调用。
【参考方案1】:
您需要模拟$reactive
组件。将其替换为在测试范围内返回 spyObj
的间谍。然后触发使$reactive
方法运行和测试的原因。
var reactiveResult = jasmine.createSpyObj('reactiveResult', ['attach']);
var $reactive = jasmine.createSpy('$reactive').and.returnValue(reactiveResult);
var controller = ;
beforeEach(function ()
module(function ($provide)
$provide.factory('$reactive', $reactive);
);
module('yourAppModule');
);
it('Should call attach', function ()
$reactive(controller).attach();
expect($reactive).toHaveBeenCalledWith(controller);
expect(reactiveResult.attach).toHaveBeenCalled();
) ;
您也可以将$reactive
spy 提供给控制器依赖项:
var reactiveResult = jasmine.createSpyObj('reactiveResult', ['attach']);
var $reactive = jasmine.createSpy('$reactive').and.returnValue(reactiveResult);
var ctrl;
beforeEach(inject(function ($controller)
ctrl = $controller('YourController', $reactive: $reactive );
));
it('Should call attach', function ()
//ctrl.triggerThe$reactiveCall
expect($reactive).toHaveBeenCalledWith(ctrl);
expect(reactiveResult.attach).toHaveBeenCalled();
) ;
【讨论】:
非常感谢!现在我对测试有了更多的了解。以上是关于Jasmine spyOn 函数和返回对象的主要内容,如果未能解决你的问题,请参考以下文章
使用 Jasmine 进行 Angular 单元测试:如何删除或修改 spyOn