- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在进行一项实验,通过测试其他人的代码(例如自动化单元和端到端测试)来学习 Angular 和 typescript 。在我对其进行测试后,我计划将其重新用于我正在为大学教室开展的宠物项目。
我至少对这里的代码进行了一半的单元测试:http://jasonwatmore.com/post/2018/05/16/angular-6-user-registration-and-login-example-tutorial
一段时间以来,我一直在尝试对以下代码进行单元测试,但到目前为止,我根据自己的想法或互联网上的想法进行的所有尝试都没有成功:
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from "@angular/common/http";
import { AuthenticationService } from "src/app/authenticationService/AuthenticationService";
import { Observable, throwError } from "rxjs";
import { catchError } from "rxjs/operators";
import { Injectable } from "@angular/core";
@Injectable()
export class ErrorInterceptor implements HttpInterceptor {
constructor(private authenticationService: AuthenticationService) {}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
console.log('before error handle')
return next.handle(request).pipe(catchError(err => {
console.log('in error handle')
if (err.status === 401) {
// auto logout if 401 response returned from api
this.authenticationService.logout();
location.reload(true);
}
const error = err.error.message || err.statusText;
return throwError(error);
}))
}
}
以下测试代码和几个变体未能使“错误句柄”消息显示在控制台日志中:
import { ErrorInterceptor } from "./ErrorInterceptor";
import { of, throwError, defer } from "rxjs";
describe('ErrorInterceptor', () => {
let errorInterceptor;
let authenticationServiceSpy;
beforeEach(() => {
authenticationServiceSpy = jasmine.createSpyObj('AuthenticationService', ['logout']);
errorInterceptor = new ErrorInterceptor(authenticationServiceSpy);
})
it('should create', () => {
expect(errorInterceptor).toBeTruthy();
})
describe('intercept', () => {
let httpRequestSpy;
let httpHandlerSpy;
const error = {status: 401, statusText: 'error'};
it('should auto logout if 401 response returned from api', () => {
//arrange
httpRequestSpy = jasmine.createSpyObj('HttpRequest', ['doesNotMatter']);
httpHandlerSpy = jasmine.createSpyObj('HttpHandler', ['handle']);
httpHandlerSpy.handle.and.returnValue({
pipe: () => {
return fakeAsyncResponseWithError({});
}
});
//act
errorInterceptor.intercept(httpRequestSpy, httpHandlerSpy);
//assert
//TBD
function fakeAsyncResponseWithError<T>(data: T) {
return defer(() => throwError(error));
}
})
})
})
最佳答案
这里有几个问题。
httpHandlerSpy.handle()
返回的值需要是一个 Observable,因为它上面已经有管道运算符,然后 HttpInterceptor 代码可以根据需要将其通过管道传递给 catchError。 我整理了一个 Stackblitz来展示我将如何处理这个问题。
来自 Stackblitz,这是规范(it
函数):
it('should auto logout if 401 response returned from api', () => {
//arrange
httpRequestSpy = jasmine.createSpyObj('HttpRequest', ['doesNotMatter']);
httpHandlerSpy = jasmine.createSpyObj('HttpHandler', ['handle']);
httpHandlerSpy.handle.and.returnValue(throwError(
{error:
{message: 'test-error'}
}
));
//act
errorInterceptor.intercept(httpRequestSpy, httpHandlerSpy)
.subscribe(
result => console.log('good', result),
err => {
console.log('error', err);
expect(err).toEqual('test-error');
}
);
//assert
})
希望对您有所帮助。
关于angular - 如何对这个 Angular typescript Http Error Interceptor 进行单元测试,该拦截器从管道 observable 中捕获错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53683895/
我正在执行命令 ng g interceptor error 其中错误是拦截器的名称 但面临如下问题: An unhandled exception occurred: Schematic "inte
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《quarkus依赖注入》系列的第五篇
我在每个 Controller 代码(例如@UseInterceptors(ClassSerializerInterceptor))中都使用了,所以我决定将其设置为全局,并且尝试设置它时不走运。 我在
应用程序开发语言:ionic + Restangular 我在 Restangular 中有一个用于 BaseUrl 和 Auth Interceptor 的全局配置。[就像 http://app 一
在我的服务类中,我需要可用的 hibernate session 。我目前在 beans.xml 中这样做: com.app.dao.UserDao
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos 本篇概览 本
mybatis采用责任链模式,通过动态代理组织多个拦截器(插件),通过这些拦截器可以改变mybatis的默认行为(诸如sql重写之类的),由于插件会深入到mybatis的核心,因此在编写自己的插件前
下面给大家介绍mybatis interceptor 处理查询参数及查询结果,具体代码如下所示: ?
我一直在尝试实现应用程序范围的拦截器,但是,我一直看到以下错误: TypeError: this.interceptor.intercept is not a function 经过多次调试,我意识到
我有一个 HTTP 拦截器。后端 API 需要自定义 header ,其值在应用初始化和其他操作期间存储在 indexdb 中。因此,我需要获取值并在每个请求中传递它。但到目前为止,未能这样做,因为拦
我的 HibernateInterceptor 有问题。我延长了 EmptyInterceptor并覆盖 onFlushDirty方法。 我使用这种方法手动检查脏值(将以前的值与当前值进行比较)来为更
我在 Angular 5 中有一个有效的拦截器。它在 App.module 的提供者中注册,并正确拦截了从应用程序发出的所有请求。 问题是它不会拦截从应用程序使用的库发出的请求。 我正在使用开源库 (
我们已经实现了以下内容 function Inteceptors($httpProvider) { 'ng-inject'; $httpProvider.interceptors.pu
我需要拦截请求/响应,类似于 java 过滤器中的处理方式。在 Django 中执行此操作的最佳方法是什么?我只是要创建自己的中间件还是已经存在其他东西? 最佳答案 如果您需要拦截客户端请求/响应,请
目前,我们在 Jboss EAP 6.2 上使用 CXF 2.7.3 时遇到问题,并出现自定义 SoapFault 异常。 当我们发送自定义 SoapFault 时,不会显示子代码及其值: 这是我们想
CDI 中拦截器的范围是什么? aka,这合法吗?我会在每个调用拦截器的地方获得相同的拦截器实例吗? @RequestScoped public class SalesForceControllerI
我正在构建一个有 2 个拦截器的 angular 5 应用程序: 重试失败的 504 请求 另一个向用户显示有关失败请求的错误消息 我希望仅当错误不是 504 或错误为 504 并且已被第一个拦截器重
利用Spring MVC 的 Interceptor 实现个简易的性能监控,计算一下每个url的执行时间。 在 preHandle 方法中记录当前的时间戳到线程局部变量里,然后在afterComp
我想知道是否有办法在 Angular 的 HttpInterceptor 中检索当前路由。我正在使用来自不同路由的相同拦截器,但我需要检查是否正在从特定路由使用拦截器。如果是这样,我想在执行之前向后端
我创建了一个简单的拦截器来将用户重定向到登录页面,服务器返回 401 错误。但是它不起作用,因为状态被设置为 404,所以 $location 永远不会被调用。 .config( function m
我是一名优秀的程序员,十分优秀!