如何防止角拦截器在茉莉花测试期间拾取$httpBackend响应
How to prevent angular interceptors from picking up $httpBackend responses during jasmine test
>我正在我的角度应用程序中为我的登录控制器编写测试,在"登录失败且凭据无效"测试期间,API 返回 401。问题是身份验证拦截器(其工作是拾取 401),干预并尝试执行未正确注入的依赖项。
以下是拦截器在我的应用程序中注入的方式.js:
$httpProvider.interceptors.push('authInterceptor');
这是拦截器的胆量(这是一个工厂):
return {
response: function(response){
return response || $q.when(response);
},
responseError: function(rejection) {
if (rejection.status === 401 && $location.path() !== '/login') {
// Clear user state.
delete $rootScope.loggedUser;
storage.clearAll();
document.cookie = "my_session=; expires=Thu, 01 Jan 1970 00:00:00 UTC";
// Redirect.
$location.path("/login");
}
return $q.reject(rejection);
}
}
这是我的测试(针对登录控制器运行,而不是上面的拦截器。理想情况下,拦截器甚至不应该在这个测试用例中执行):
it('should fail with invalid credentials', inject(function($httpBackend, $location, storage) {
$httpBackend.expectPOST('/api/login').respond(401);
scope.loginCredentials = {email : 'email@email.com', password : 'password'};
scope.login(scope.loginCredentials);
$httpBackend.flush();
}));
我对存储库的模拟是这样注入的——
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);
});
相关文章:
- 如何将getJson的响应保存在全局变量中
- 如何使用Spring MVC将Facebook返回的响应数据保存在Java类中
- 使用angularjs向浏览器发送servlet响应(下载功能)
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- 不再使用innerHTML进行AJAX响应.(代码未得到响应)
- 为什么可以't我使用了AJAX响应的一部分
- 响应动画手风琴不工作
- 如何从SeleniumWebdriver获取异步Javascript响应
- Ajax调用在Firefox中不会自动响应
- 可以在响应时隐藏iphone上的“播放”按钮以进行视频播放
- 由于响应中不存在“Access Control Allow Origin”标头,跨域请求停止工作
- 如何在 JavaScript 和 HTML 中更改对输入框的提示响应
- IIS动态HTTP响应标头
- 预期响应包含一个对象,但在angular js中得到一个数组错误
- Ajax响应转换
- httpBackend模拟json文件响应
- 单元测试接收到带有$httpBackend的二进制响应
- 如何防止角拦截器在茉莉花测试期间拾取$httpBackend响应
- AngularJS-使用ngMockE2E$httpBackend如何延迟特定响应
- 角httpBackend美元.expectGET -响应409状态&自定义statusText