gpt4 book ai didi

unit-testing - 如何模拟在 module.run Angular 应用程序中执行的 http 调用?

转载 作者:行者123 更新时间:2023-12-04 05:26:15 25 4
gpt4 key购买 nike

我正在尝试运行以下代码(其中 fusseApp 是一个 angularModule):

fusseApp.run(function(URI, $http){

$http.get('/check/userLogged').then(function(response){
console.log(response);
});

PS:实际上我的http调用是在一个工厂中执行的,这里我们只是调用了这个工厂

angularModule 被模拟为:

angular.module('fusseApp.mainMocks', ['fusseApp', 'fusseApp.loginMocks', 'ngMockE2E', 'ngResource'])
.run(function($httpBackend, $http) {

...

$httpBackend.whenGET('/check/userLogged').respond(200,response);

我的问题是 fusseApp.run 在模拟模块初始化之前执行。所以我有一个错误:

未捕获错误:意外请求:GET/check/userLogged预计不会有更多请求

Jasmine 单元测试中似乎已经提出了这个问题,但我找不到解决方案。是否可以在告诉我应用程序何时完全初始化的事件后运行我的 $http 调用?

我需要在屏幕上显示任何数据之前检查用户是否已通过身份验证。

最佳答案

也许这可以帮助...

.run() 如果你在你的代码中设置 ng-app="" 总是被执行,它是 boostrap 过程的一部分,从那里你可以'不要停止编译和链接过程,但是有很多方法可以防止在用户未登录时呈现 View :

A) 可以在身份验证确定后进行手动 Angular 引导(不太有趣但可行),使用 jQuery $.ajax 或其他库,因为 $http 服务在 NG 之外。

B) 但在您的 .run() 中,您可以访问 $rootScope 和所有 NG 服务,因此您可以监听 $stateChangeStart 并在监听器内部执行身份验证。

这或多或少是 NG 身份验证的最佳实践,每次用户更改状态时此监听器都会检查,(这很好,以便您可以捕获 session 过期),在我的代码中(我在各种产品中使用它项目)我正是这样做的:

$rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams) {
if (!AuthService.isAuthenticated()) {
$state.transitionTo("login"); // redirect to login page
event.preventDefault();
}
});

AuthService 只是一个简单的服务,它在用户通过身份验证时返回 truefalse。根据我的经验,向未经授权的用户隐藏 View 和重定向的最佳解决方案是像我之前展示的那样捕获状态更改过程。因为你可以装饰状态,所以这些属性可以在 toState 参数中访问(至少在 ui-router 中)所以可以做各种奇特的事情,比如捕捉用户 Angular 色等等......

关于unit-testing - 如何模拟在 module.run Angular 应用程序中执行的 http 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19786303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com