Angular 单元测试 - 模拟 REST 服务调用

2023-12-13

我正在为 Angular 应用程序编写单元测试来测试前端功能,并尝试生成一种方法来模拟以下场景的休息服务调用:

我有一个类定义如下:

import { Component, OnInit } from '@angular/core';
import {RestService} from "../../../../../services/rest.service";
import {ActivatedRoute, Router} from "@angular/router";

@Component({
  selector: 'app-example-class’,
  templateUrl: ‘./example-class.component.html',
  styleUrls: [‘./example-class.component.scss']
})
export class ExampleClass implements OnInit {

  myData: any = [];
  reloadInterval: any;
  constructor(private rest: RestService) {
    this.reloadInterval = setInterval(() => {
      this.getData();
    }, 10000);
  }

  ngOnInit() {
    this.getData();
  }

  ngOnDestroy(){
    clearInterval(this.reloadInterval);
  }

  getData() {
    this.rest.call(‘exampleClass’, this.rest.id).subscribe((data: {}) => {
      if (data['rows']) {
        this.myData = data['rows'].reduce((accumulator, currRow)=> accumulator + currRow.value, 0);
      }
    });
  }
}

我想使用 Karma/Jasmine 单元测试框架专门测试我的“getData()”方法。这是我创建的:

describe(‘ExampleClassComponent', () => {
  let component: ExampleClass;
  let fixture: ComponentFixture<ExampleClass>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [
        HttpClientTestingModule,
      ],
      declarations: [ ExampleClass ]
    })
    .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(ExampleClass);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create',
    inject(
      [HttpTestingController],
      (httpMock: HttpTestingController) => {
    expect(component).toBeTruthy();
  }));
});

这有效。组件已创建并且测试通过。但是,当我尝试执行以下操作时:

it('should test number of elements', ()=>{
    component.getData();
    expect(component.myData.length).toBe(1);
 });

这失败了。它失败了,因为它试图通过对未运行的服务的休息调用来调用 getData() 方法。我想以某种方式模拟该函数中进行的其余调用。我尝试在我的测试类中创建一个 MockRestService 类,如下所示:

class MockRestService extends RestService {
  myData = [
    {myData: 1}
  ];

  call(endpoint: string, params?: Object, data?: any, queryString?: string, isCustomUri?: boolean): Observable<any> {
    return of(this.myData);
  }
}

然后修改我的测试:

  it('should test number of elements', ()=>{
    let mockRestService = new MockRestService(null);
    component = new ExampleClass(mockRestService);
    component.getData();
    expect(component.myData.length).toBe(1);
  });

但这行不通。是否可以出于测试目的模拟 getData 中进行的其余调用,如果可以,如何模拟?我真的很感谢你的帮助!


你不需要单独MockRestService类,但可以使用 Jasmine 的spyOn嘲笑RestService.call方法。这可能如下所示。

it('should test number of elements', ()=> {

    // given
    const restService = TestBed.inject(RestService);
    const data = {} // define your rest call data
    spyOn(restService, 'call').and.returnValue(of(data));

    // when
    component.getData();

    // then
    expect(component.myData.length).toBe(1);
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular 单元测试 - 模拟 REST 服务调用 的相关文章

随机推荐

  • C# 的单例模式 [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我需要存储一堆需要全局访问的变量 我想知道单例模式是否适用 从我看到的例子来看 单例模式只是一个不能被继承的静态类 但我见过的例子对于我的需求来说过于复杂 最简单的单例类是什么 我不能创建
  • android - 让 onTouch 优先于 onClick

    我有一个允许用户在 3 个不同视图之间滑动的活动 每个视图都显示图像列表 这些图像具有调用新活动并使图像全屏显示的 onClick 事件 这一切都正常 但是如果我尝试在 3 个不同的视图之间滑动并且我的手指在图像上滑动 它将触发 onCli
  • JavaFX 3D 对象之间的并集、交集和差异

    有没有办法在 JavaFX 3D 对象之间执行布尔运算 例如并集 交集和差集 例如在 Sphere 实例 Cylinder 实例和 Box 实例之间 从 Shape 类继承的 JavaFX 2D 对象已经具有 union 和 minus 方
  • 从外部模块访问资源文件

    到目前为止 在非模块化 java 之前 您只需将文件放入src main java resources确保它在类路径中 然后加载它 file getClass getClassLoader getResourceAsStream myfil
  • 如何存储和搜索 IP 地址

    我有 4 个 IP 地址源 我想将它们存储在 SQL Server 中 并允许按来源国家 地区代码分类的范围按国家 地区在排除列表中创建 为此我有两张桌子 IP地址范围 国家代码 我需要知道的是 如果此数据返回到客户端然后缓存以供快速查询
  • 如何在后台状态下获取来电/去电事件

    在我的一个应用程序中 它具有我成功实现的播放声音的功能 即使当应用程序正在运行 前台状态 并且我们收到来电时 应用程序音乐也会停止并在呼叫断开时再次恢复 现在真正的问题就在这里 当应用程序进入后台状态时 我们不会收到任何来电 去电事件 在后
  • 改进 Retina iPad 上的缓慢画布动画 - KineticJS

    我正在使用 KineticJS 执行 HTML Canvas 动画 动画可以在所有桌面浏览器和非视网膜 iDevices 包括 iPad mini 上完美运行 但是 从视网膜设备 浏览器或使用 appcelerator 的应用内 Web 视
  • 这个打印样式表如何工作?

    我真的很喜欢如何http www honorshaven com 看起来是打印出来的 pdf 我浏览了源代码 试图弄清楚他们是如何做到的 我的导航总是在打印时变成丑陋的项目符号列表 我不知所措 有人知道吗 任何帮助都是极好的 谢谢 马丁 编
  • 获取所有模型类型

    如何获取属于模型一部分的实体类型列表 以便我可以测试模型是否确实适用于该实体类型 var dcx new MyDbContext var lst new List
  • 是否可以将 JavaVM * 和 JNIEnv * 保存为全局变量并在其他地方使用?

    JavaVM javaVM NULL JNIEnv jniEnv NULL createJavaVM javaVM 无效 jniEnv javaVMInitArgs 其中 javaVM 和 jniEnv 是全局变量 是否可以将JavaVM
  • Z3 Java API 文档

    我已经安装了Z3 API for Java我正在尝试使用它 但找不到任何解释如何使用此 API 的文档 到目前为止我找到的唯一资源是源代码和示例程序 所以我想知道是否有人知道任何其他文档Z3 Java API 目前 Java API 没有单
  • 使用 swing 组件在框架中打开文本文件

    我想使用 swing 组件打开框架中的文本文件 最好具有突出显示功能 我在第一帧中提交的文本中获取文本文件的名称 并想在第二帧中打开该文本文件 我的代码是 import javax swing import java awt import
  • Laravel 验证:必须是符合“json”规则的有效 JSON 字符串

    我正在制作 Laravel API 但我似乎无法在其中一篇文章中发送 JSON 数据 我检查了 StackOverflow 中的其他帖子 但似乎我的 JSON 请求是正确的 所以我似乎找不到错误 这是我的控制器方法中的代码 validato
  • 如何初始化参数化模板类的静态成员

    我不认为我的问题重复this one 我尝试做的事情 template
  • JavaScript 深度优先搜索

    我正在尝试用 JavaScript 实现 DFS 但遇到了一些问题 这是我的算法课 use strict define function return function var that this this search function
  • 我想了解 @Html.DisplayFor(modelItem => item.FirstName) 中的 lambda 表达式

    我对 C 和 MVC 相当陌生 并且在某些场合使用过 lambda 例如匿名方法和 LINQ 通常我看到的 lambda 表达式看起来像这样 x gt x Name x gt Console WriteLine x 我知道 lambda 去
  • 使用 PHP 获取 SQL-Server 中的行数

    我对 SQL Server 和 PHP 相当陌生 但我正在尝试使用 PHP 获取表中的总行数 这是我正在使用的代码 它连接得很好 但它不会打印行数 b Error b Could not connect to the server data
  • Maven 中同一项目的 maven-jaxb2-plugin 片段,可能吗?

    我有一个basic xsd和另外两个A xsd and B xsd A xsd and B xsd转换为两个不同的 java 包 因此我需要同一插件的两次 Maven 执行 两个 XSD 均指basic xsd对于一些共享类 如果basic
  • 从 COM 加载项窗口中选择 [删除] 后无法重新注册 VSTO 加载项

    我正在为 Ms Word 开发 VSTO 插件 VS 2017 中的运行 gt 开始 F5 运行良好 今天 我通过发布加载项 ClickOnce 生成 vsto 文件 并在我用于开发 调试的同一台计算机上进行设置来运行我的第一次测试 为了在
  • Angular 单元测试 - 模拟 REST 服务调用

    我正在为 Angular 应用程序编写单元测试来测试前端功能 并尝试生成一种方法来模拟以下场景的休息服务调用 我有一个类定义如下 import Component OnInit from angular core import RestSe