我的Angular控制器中有一个函数,如下所示:
$scope.myFunction = function(){ $scope.myVariable = "something"; $scope.myOtherVariable = "something else"; window.location.href = "/path/to/page"; }
一个简单的Jasmine测试涵盖了上述功能,看起来像:
describe('my test',function(){ it('should pass',function(){ scope.myFunction(); expect(scope.myVariable).toBe('something'); expect(scope.myOtherVariable).toBe('something else'); }); });
上面的测试本身通过,但随后Karma在控制台中抛出以下错误:
Some of your tests did a full page reload!
我想在Jasmine测试中给出匿名函数和Angular名称,然后在原始函数中使用arguements.callee.caller.name来确定函数是自己调用还是Jasmine调用.不幸的是,arguments.callee.caller.name总是返回undefined,我怀疑它是由Angular和Jasmine相互链接的方式引起的.
问这个问题已经很久了,但是下面的方法应该更清洁:
通过更改原始函数以使用Angular的$window服务而不是浏览器窗口对象,可以编写不需要修改生产代码或考虑任何运行时参数的测试.这当然要求$window是找到函数的控制器的依赖项.
使用angular-mocks/ngMock,类似于:
var fakeWindow = { location: { href: '' } } // instantiate controller with mock window beforeEach(inject(function($controller) { $controller('YourCtrlName',{ $window: fakeWindow }); }));
应该允许测试通过,假设控制器不需要$window其他任何东西.