Angular单元在使用Angular UI的路由器时进行测试,全局化$ httpBackend模拟响应

时间:2016-01-11 20:25:33

标签: javascript angularjs angular-ui-router angular-ui

我正在使用Angular和Angular UI的路由器。作为路由器配置的一部分,我有resolve运行一些API调用:

$stateProvider.state('someState', {
    templateUrl: '...',
    resolve: {
        auth: someFunction
    },
    controller: 'SomeStateCtrl'
});

someFunction()会进行API调用:GET /someAPICall

现在,我说我正在为一些与此状态完全无关的服务编写测试someFunction()GET /someAPICall

angular.module('app').service('SomeSvc', function () {
    this.something = function () {
        return $http.get('/someOtherCall');
    };
});

describe('SomeSvc Test', function () {
    var SomeSvc, $httpBackend;

    beforeEach(module('app'));

    beforeEach(inject(function (_SomeSvc_, _$httpBackend_) {
        SomeSvc = _SomeSvc_;
        $httpBackend = _$httpBackend_;
    }));

    it('test', function () {
        $httpBackend.whenGET('/someOtherCall').respond({
             example: 'text'
        });

        SomeSvc.something().then(function (data) {
            expect(data.example).toBe('text');
        });

        $httpBackend.flush();
    });
});

如上所示,SomeSvc拨打/someOtherCall,但不是/someAPICall。但是当我去运行此单元测试时,$httpBackend.flush()最终会尝试处理从路由器生成的/someAPICall

Error: Unexpected request: GET /someAPICall

当然,我可以通过在我的测试中提供额外的.whenGET来处理/someAPICall来轻松解决此问题,但这不会扩展。我最初的想法是创建一些处理所有这些路由器API调用的全局测试服务(除了我的简化示例),所以我不需要在任何测试中重新定义它们。但是,鉴于我似乎无法找到关于此事的任何信息,我觉得我正在做的事情是缺少标记,我应该以不同的方式运行。

赞赏任何意见。

0 个答案:

没有答案