如何使用http测试控制器进行单元测试

时间:2019-06-03 23:11:02

标签: angular testing

这是我第一次进行单元测试,说实话,我还不太了解它的工作原理和目的。

我正在尝试通过发送有效/无效的“代码”来测试请求JWT令牌的角度服务功能。 因此,在请求中,我发送{“ code”:“ something”},并在成功或错误时返回JWT令牌(实际上,在两种情况下,它都返回200 OK,但只有主体会更改。就像成功时,它会返回{“ token “:” something“,” expireDate“:” something“},并在失败时{{error”:“ message”}这样)。 所以在这里我试图通过

模拟失败响应
req.error(new ErrorEvent("ERROR"));

无论我如何模拟错误或更改后跟期望的方法,我都不会得到 单元测试通过。 就像我愿意

expect(result).toBe("random string");

它仍然通过。

另外,我不明白的是为什么

service.getTmwJwt(dummyCode).subscribe(result => {
    expect(result).toThrow();
  });

期望(结果)在req.error / flush之前出现? 因为req.error模拟了错误的响应。它不是应该比断言值先来吗?

这是原始的测试代码。

it('should return an error observable<Authorization> on error response', 
( ) => {
const dummyCode = 'invalid';

service.getJwt(dummyCode).subscribe(result => {
  expect(result).toThrow();
});
//will have to check the body since error also returns 200 ok 
//instead of req.flush, do req.error
const req = httpMock.expectOne(`${CONST.TOKEN_URL}`);
expect(req.request.method).toBe('POST');

req.error(new ErrorEvent("ERROR_BAD_CODE_REQUEST"));
httpMock.verify();



});

这是我正在测试的服务功能。

public getJwt(code: any): Observable<Authorization> {
// const url = 'https://actualURL';
return this.http
  .post<any>(CONST.TOKEN_URL, { code: "code"}) 
  .pipe(catchError(this.handleError)); //returns failure observable
}

听起来确实很愚蠢,但我想我缺少一些概念。 谢谢。

0 个答案:

没有答案