Angular 5 (Karma / Jasmine Testing) - 使用模拟后端模拟错误消息的错误响应

Angular 5 (Karma / Jasmine Testing) - Using a mock backend to mock error responses for error messages

我不太明白 MockBackend 功能是如何工作的 described over here。我是 Angular.

的新手

我想编写一些测试用例,以确保当后端发生服务器错误时,我拥有的 Angular 组件会在前端显示错误消息。这需要有意 return 错误的 HTTP 请求。我 运行 遇到了 jasmine-ajax 和 nock 包的麻烦,但有人告诉我关于编程实例

即使您已经实现了一个实际的后端,您仍然可以创建一个模拟后端来测试在显示之前首先需要 HTTP 请求的表单消息的外观吗?

一个例子是当用户被要求填写一个销售表格,并在发送它时,服务器遇到错误并发送回 500 Internal Server Error 响应,然后前端显示服务器错误消息.

我不太了解 Angular 中的模拟后端。我担心的是,通过模拟后端,它会导致 all 我在组件控制器中发出的请求,以及在测试用例中发出的请求到 模拟后端而不是实际后端 ,从而在我的测试套件中引入误报失败。

如果我对测试套件进行编程以使用“@angular/http/testing”中的 MockBackend class,这会导致我对所有 Angular 组件发出 HTTP 请求吗发给那个模拟后端服务器而不是实际服务器?

编辑:这是 case of what I'm referring to。通过使用MockBackend,一些需要向实际服务器发送HTTP请求的测试将不会被发送。

如果我错了,请纠正我,根据您的描述,我假设您使用的是 http 模块。您可以考虑升级到 httpClient module, for which testing against server errors is pretty straightforward: https://angular.io/guide/http#testing-for-errors

顺便说一句,单元测试应该是独立的。您应该模拟所有依赖项(可能是测试模块的提供者)并且不向实际服务器发送任何请求。信息和状态代码都可以使用 http testing module 来模拟。

我认为模拟 httpclient 是一种代码味道。我更喜欢创建自己的 api 类 来包装 http 或 httpClient。然后在您的单元测试中,您可以使用 jasmin 间谍来 return 测试所需的数据。

看这个例子https://angular.io/guide/http

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable()
export class ConfigService {
  constructor(private http: HttpClient) { }
}

configUrl = 'assets/config.json';

getConfig() {
  return this.http.get(this.configUrl);
}

然后在你的测试中(伪代码,不记得语法了):

spyOn(configService, 'getConfig').and.returnValues({data:123});