Javascript 如何防止角度拦截器在jasmine测试期间拾取$httpBackend响应

Javascript 如何防止角度拦截器在jasmine测试期间拾取$httpBackend响应,javascript,angularjs,jasmine,karma-runner,interceptor,Javascript,Angularjs,Jasmine,Karma Runner,Interceptor,我正在angular应用程序中为登录控制器编写测试,在“使用无效凭据登录失败”测试期间,API返回401。问题在于身份验证拦截器(其任务是获取401)介入并尝试执行尚未正确注入的依赖项 以下是如何在my app.js中注入拦截器: $httpProvider.interceptors.push('authInterceptor'); 以下是拦截器(它是一个工厂)的内部结构: 下面是我的测试(针对登录控制器运行,而不是上面的拦截器。理想情况下,拦截器甚至不应该在这个测试用例中执行): 我对存储库

我正在angular应用程序中为登录控制器编写测试,在“使用无效凭据登录失败”测试期间,API返回401。问题在于身份验证拦截器(其任务是获取401)介入并尝试执行尚未正确注入的依赖项

以下是如何在my app.js中注入拦截器:

$httpProvider.interceptors.push('authInterceptor');
以下是拦截器(它是一个工厂)的内部结构:

下面是我的测试(针对登录控制器运行,而不是上面的拦截器。理想情况下,拦截器甚至不应该在这个测试用例中执行):

我对存储库的模拟就是这样注入的-

var LoginCtrl,
    mockStorage,
    store,
    scope;

// Initialize the controller and a mock scope
beforeEach(inject(function ($controller, $rootScope, storage, User) {
    scope = $rootScope.$new();
    store = [];

    mockStorage = storage;
    spyOn(mockStorage,'get').andCallFake(function(key){
        return store[key];
    });
    spyOn(mockStorage,'set').andCallFake(function(key, val){
        store[key] = val;
    });

    LoginCtrl = $controller('LoginCtrl', {
        $scope: scope,
        $rootScope: $rootScope,
        storage: mockStorage,
        User: User
    });
}));
问题是测试中的模拟存储库没有被拦截器调用,而是尝试注入真实的存储库,但未成功,导致库中出现内部错误:

TypeError: Cannot read property 'clear' of undefined
    at Object.publicMethods.clearAll (/path/to/app/ui/app/bower_components/ngStorage/src/angularLocalStorage.js:178:12)
有什么建议吗?谢谢

请参阅。您需要用模拟的服务覆盖真正的存储服务:

  module(function ($provide) {
      $provide.value('storage', mockStorage);
  });

您如何尝试注入模拟存储?你能把那段代码也放进去吗?就是这样,非常感谢。我不得不对存储库进行更深入的模拟,但我补充说,在每次测试之前,拦截器都正确地使用了模拟版本。它对我也很有效,但我不明白为什么。如果本例中的存储是工厂,那么它不应该是$provide.factory('storage',mockStorage)?否,因为mockStorage是来自原始工厂的返回值,而不是工厂本身
$provide.factory
希望使用具有返回值的函数作为注入值。您可以在return语句中看到value如何包装函数。希望这是有道理的。
TypeError: Cannot read property 'clear' of undefined
    at Object.publicMethods.clearAll (/path/to/app/ui/app/bower_components/ngStorage/src/angularLocalStorage.js:178:12)
  module(function ($provide) {
      $provide.value('storage', mockStorage);
  });