我发现如果我尝试模拟Angular的$ location服务,然后我需要在我的测试中强制使用任何类型的摘要,那么我会得到无限的摘要错误。在我的控制器中代码是什么并不重要。我用一个完全空的控制器尝试了这个,它只需要$ location作为参数,如果我在测试中做了摘要,那么它就失败了。
Here's a fiddle这是我从那个小提琴那里得到的考验:
describe('fooController', function() {
var controller, mocklocation, scope;
beforeEach(function() {
module("myModule");
inject(function($rootScope, $controller, $location) {
scope = $rootScope.$new();
mocklocation = sinon.stub($location);
controller = $controller("FooController", { $scope: scope, $location: location });
});
});
describe('when calling $digest in a test', function () {
beforeEach(function () {
//do some stuff here and then resolve a promise
//call digest to cause the resolved promise to get evaluated
scope.$root.$digest();
});
it('should not get infinite digests', function () {
});
});
});
请注意,我正在做的只是一个范围。$ root。$ digest在该测试中。在我的真实代码中,我在该摘要之前解决了一个承诺,这就是我需要进行摘要的原因。
答案 0 :(得分:1)
我建议您手动滚动自己的模拟和存根,而不是尝试模拟整个$ location服务。例如,如果您使用mockLocation断言使用特定路径调用路径函数,则可以像下面这样设置模拟:
mockLocation = { path: sinon.stub() };
然后你仍然可以断言同样的事情:
expect(mockLocation.path.calledWith(...)).toBeTruthy();
我不确定为什么存根整个对象导致无限消化(这些都是如此棘手!)但这至少应该让你前进。此外,在您的测试中,请确保在注入时发送mockLocation对象(现在您有“$ location:location”)。
controller = $controller("FooController", { $scope: scope, $location: mockLocation });