模拟$ location时的无限摘要

时间:2014-01-21 21:27:30

标签: angularjs testing mocking

我发现如果我尝试模拟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在该测试中。在我的真实代码中,我在该摘要之前解决了一个承诺,这就是我需要进行摘要的原因。

1 个答案:

答案 0 :(得分:1)

我建议您手动滚动自己的模拟和存根,而不是尝试模拟整个$ location服务。例如,如果您使用mockLocation断言使用特定路径调用路径函数,则可以像下面这样设置模拟:

mockLocation = { path: sinon.stub() };

然后你仍然可以断言同样的事情:

expect(mockLocation.path.calledWith(...)).toBeTruthy();

我不确定为什么存根整个对象导致无限消化(这些都是如此棘手!)但这至少应该让你前进。此外,在您的测试中,请确保在注入时发送mockLocation对象(现在您有“$ location:location”)。

 controller = $controller("FooController", { $scope: scope, $location: mockLocation });