angular - Jasmine 单元测试 HttpInterceptor 验证方法参数
问题描述
我有一个 Angular (6) HttpInterceptor,就像这个拦截方法一样:
intercept(req: HttpRequest<any>,next: HttpHandler): Observable<HttpEvent<any>> {
if (this.translationService.currentLang) {
req = req.clone({
setHeaders: {
'Accept-Language': this.translationService.currentLang
}
});
}
return next.handle(req);
}
如何使用 jasmine 进行单元测试并检查返回的请求是否包含新标头?我知道我可以得到参数
let next = jasmine.createSpyObj('httpHandler', ['handle']);
next.handle.calls.mostRecent();
但是如何验证标头是否已设置?
解决方案
这是我用来测试一些拦截器的内容:
describe(`interceptor: yourinterceptor`, () => { // CHANGE HERE
let httpMock: HttpTestingController;
let injector: TestBed;
function createTestModule(providers: Provider[] = []) {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule, RouterTestingModule],
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: YOUR_INTERCEPTOR, // CHANGE HERE
multi: true
},
...providers
]
});
injector = getTestBed();
httpMock = injector.get(HttpTestingController);
}
beforeEach(() => {
// empty
});
afterEach(() => {
httpMock.verify();
});
describe('request with headers', () => {
beforeEach(() => {
createTestModule();
});
it('should make the request with headers', inject([HttpClient], (http: HttpClient) => {
http.get('/dummy').subscribe();
const httpRequest: TestRequest = httpMock.expectOne('/dummy');
expect(httpRequest.request.headers.has("YOUR_HEADER")).toBeTruthy(); // CHANGE HERE
}));
});
});
推荐阅读
- c++ - OpenGL围绕点移动相机
- sql - 在 SQL Server 中 sp_rename 之后丢失了一个表,第二个参数中有不必要的架构名称
- javascript - 如何使用JS在IE浏览器中重新加载/刷新页面而不弹出表单重新提交
- c++ - 不包含密钥时的 std::map::lower_bound 或 std::map::upper_bound ?
- angular - 使用 Angular 2-4 编写 Jasmine 测试用例时 first 不是函数
- html - 页面内导航或网站导航?
- mysql - 我可以这样在MySQL中使用问号吗
- sql - 带有整数和字符串的 Django Concat 列
- sql-server - 如何将所有模式从一个数据库复制到另一个数据库(在运行时创建)?
- javascript - 使用 map 和 redux 时子道具触发重新渲染