首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >测试可见物体角度2的业力

测试可见物体角度2的业力
EN

Stack Overflow用户
提问于 2016-12-20 19:21:34
回答 2查看 10.7K关注 0票数 6

我正在使用Karma处理我的Angular 2的单元测试用例,我被一个函数卡住了,在这个函数中,我运行了以下代码的测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
expect(component.subscribeToEvents()).toBeTruthy();

我查看了我的覆盖率代码,测试文件中的行似乎没有覆盖订阅中的任何内容。我曾尝试使用MockBackend模拟服务上的函数内部的api调用,但我不确定如何在订阅的对象上执行模拟,有人能帮助我吗?

下面是test.component.ts格式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
subscribeToEvents() {
this.subscription = this.czData.$selectedColorZone
  .subscribe(items => {
    this.resourceLoading = true;
    if (!this.resourceData || (this.resourceData && this.resourceData.length === 0)) {
      this.settings.layout.flypanel.display = false;
      this.getAllResources(this.pagination.start, this.pagination.size);
    }
    else {
      this.pagination.start = 1;
      this.pagination.end = this.pagination.size;
      this.getAllResources(1, this.pagination.size);
      this.settings.layout.flypanel.display = true;
    }
  });
return true;

}

覆盖率代码的屏幕截图

EN

回答 2

Stack Overflow用户

发布于 2016-12-20 20:35:25

您不能这样做,因为订阅是异步解析的。因此,同步测试在异步任务解决之前完成。

如果你想要的只是覆盖率,你可以把测试设为async。这将导致角度测试区等待,直到异步任务解决,然后才完成测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { async } from '@angular/core/testing';

it('..', async(() => {
  component.subscribeToEvents();
}))

你不能在这里期望任何东西,因为当任务被解决时没有回调钩子。所以这真的是一个毫无意义的测试。它将为您提供覆盖范围,但您实际上并没有测试任何东西。例如,您可能希望测试在解析订阅时是否设置了变量。

根据提供的代码,我要做的只是模拟服务,并使其同步。你怎么能这样做呢?我们你可以让这个模拟像这样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class CzDataSub {
  items: any = [];

  $selectedColorZone = {
    subscribe: (callback: Function) => {
      callback(this.items);
    }
  }
}

然后只需在测试中配置它

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let czData: CzDataStub;

beforeEach(() => {
  czData = new CzDataStub();
  TestBed.configureTestingModule({
    providers: [
      { provide: CzData, useValue: czData }
    ]
  })
})

现在,在测试中,您不需要将其设为async,只需在模拟上设置items属性,就可以提供所需的任何值,订阅者将获得该值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
it('..', () => {
  czData.items = something;
  component.subscribeToEvents();
  expect(component.settings.layout.flypanel.display).toBe(false);
})

更新

当我写这篇文章时,我想我已经半睡半醒了。上述语句之一是不正确的

在这里你不能期望任何东西,因为当任务被解决时没有回调钩子。

这并不完全正确。这就是fixture.whenStable()的用途。例如,如果这是您的服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class CzData {
  _value = new Subject<>();

  $selectedColorZone = this._value.asObservable();

  setValue(value) {
    this._value.next(value);
  }
}

然后,这就是如何使测试工作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let czData: CzData;
let fixture: ComponentFixture<YourComponent>;
let component: YourComponent;

beforeEach(() => {
  TestBed.configureTestingModule({
    providers: [ CzData ],
    declarations: [ YourComponent ]
  });
  fixture = TestBed.createComponent(YourComponent);
  component = fixture.componentInstance;
  czData = TestBed.get(czData);
})

it('..', async(() => {
  component.subscribeToEvents();
  czData.setValue(somevalue);
  fixture.whenStable().then(() => {
    expect(component.settings.layout.flypanel.display).toBe(false);
  })
}))

我们使用fixture.whenStable()来等待异步任务完成。

这并不是说使用mock是错误的。很多时候,使用mock将会是一种方式。我只是想纠正我的说法,并展示如何做到这一点。

票数 6
EN

Stack Overflow用户

发布于 2019-02-02 04:50:41

考虑一下如何测试Angular输出,因为它们是在测试期间订阅的:https://angular.io/guide/testing#clicking

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
it('should raise selected event when clicked (triggerEventHandler)', () => {
  let selected: Hero;
  comp.selected.subscribe((hero: Hero) => selectedHero = hero);

  heroDe.triggerEventHandler('click', null);
  expect(selectedHero).toBe(expectedHero);
});

所以试试吧:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const expectedItem = {}; // mock the expected result from 'subscribeToEvents'

it('should raise selected event when clicked (triggerEventHandler)', () => {
  let selectedItem: any; // change to expected type
  component.subscribeToEvents.subscribe((item: any) => selectedItem = item);
  // fixture.detectChanges(); // trigger change detection if necessary here, depending on what triggers 'subscribeToEvents'
  expect(selectedItem).toBe(expectedItem);
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41249743

复制
相关文章
Makefile文件
title: Makefile文件 文章目录 title: Makefile文件 Makefile文件 Makefile文件 make命令执行时,需要一个makefile文件,以告诉make命令需要怎么样的去编译和链接程序。 image.png image.png image.png image.png
AI拉呱
2021/01/14
6080
输出cglib以及jdk动态代理产生的class文件
好奇心重的小伙伴有一种知其然,亦欲知其所以然的特性,我们在spring事务应用中会接触到aop技术,而aop背后隐藏的恰恰是以jdk以及cglib为基础的动态代理技术,博主不才,将自己的学习历程记录于此,希望帮到有需求的同行,其实我们仅需要进行简单的设置,即可输出cglib以及jdk动态代理产生的class文件,然后使用jdt或者其他工具查看生成的动态代理类,以验证理论知识:
johnhuster的分享
2022/03/29
5420
Makefile文件编写
make 的参数有很多, 可以通过 make -h 去查看, 下面只介绍几个我认为比较有用的。
用户2929716
2018/08/23
1.2K0
Makefile 文件格式;makefile伪目标
           第二行的gcc -o test prog.o code.o是可运行命令。
西湖醋鱼
2020/12/30
8290
多文件目录Makefile的写法
  linux下程序开发,涉及到多个文件,多个目录,这时候编译文件的任务量比较大,需要写Makefile
杨永贞
2020/08/04
4K0
多文件目录Makefile的写法
EditPlus如何设置保存时不产生.bak备份文件?
大家在使用EditPlus时都会遇到这么一个问题,就是每次保存或者修改后保存时都会生成一个.bak后缀的文件,这个是一个缓存文件。那如何才能不生成该缓存文件呢?操作如下图所示:
黑泽君
2018/10/11
1.5K0
makefile 指定文件的生成目录[通俗易懂]
1.上一篇博客虽然简单实现了自动处理依赖关系,但是生成的各种临时文件都混在一起,太乱了。
全栈程序员站长
2022/09/01
4.3K0
makefile文件编写「建议收藏」
makefile文件用于管理和组织代码工程的编译和链接,其不是可执行文件,其被make工具解析并完成相关动作,下面笔者将介绍makefile中常用的一些语法说明:
全栈程序员站长
2022/09/06
3.3K0
makefile文件编写「建议收藏」
【Makefile】简单的Makefile编写
Makefile编写 程序的编译和链接 使用C、C++编写可执行文件,首先要把源文件编译成中间代码文件,Linux下是.o文件,即Object File,这个动作叫做编译(complie)。 然后再把大量的Object File合成执行文件,这个动作叫链接(link)。 一个项目会拥有成百上千个源程序文件,再使用G++ or GCC会很麻烦。于是Makefile闪亮登场。 Makefile确定整个工程的编译规则,只需要一个make命令,就可以实现“自动化编译”。 make是一个解释Make
半生瓜的blog
2023/05/13
1K0
【Makefile】简单的Makefile编写
make命令和makefile文件
  make命令和makefile文件的结合提供了一个在项目管理领域十分强大的工具,它不仅常被用于控制源代码的编译,而且还用于手册页的编写以及将应用程序安装到目标目录。
全栈程序员站长
2022/07/18
2.6K0
浅谈内核的Makefile、Kconfig和.config文件
Linux内核源码文件繁多,搞不清Makefile、Kconfig、.config间的关系,不了解内核编译体系,编译修改内核有问题无从下手,自己写的驱动不知道怎么编进内核,不知道怎么配置内核,这些问题都和Makefile、Kconfig、.config有关,下面简单谈谈Makefile、Kconfig和.config。希望对你有启发。
韦东山
2020/09/30
3.8K0
浅谈内核的Makefile、Kconfig和.config文件
Scrapy之日志文件的产生
我们写爬虫的时候,也许会需要记录一些数据或者异常信息,通常这些数据我们会希望以日志的形式保存下来。
钱塘小甲子
2019/01/29
9120
一个Makefile 文件实例模板
1  在Linux下,一般使用GCC文件,比较头疼的问题,每次编写Makefile文件,比较麻烦,关键是经常忘记makefile语法;
无限之生
2020/06/30
7240
5个编写高效Makefile文件的最佳实践
在编写Makefile文件之前,我们需要明确我们的目标是什么。我们需要知道我们需要构建哪些文件,以及它们之间的依赖关系。为了确定目标,我们需要考虑以下问题:
小万哥
2023/05/20
3040
5个编写高效Makefile文件的最佳实践
设置打印输出不缓冲
❝通过设置setvbuf函数达到打印输出不缓冲的功能,以消除输出延时。❞ 原型 int setvbuf(FILE *stream, char *buffer, int mode, size_t size); 「stream」:将缓冲区设置为文件流。 「buffer」:指向流使用的缓冲区的指针,或指向仅更改大小和模式的空指针。 「mode」:缓冲模式使用。它有以下值之一: _IOFBF 全缓冲 _IOLBF 行缓冲 _IONBF 没有缓冲 「size」:缓冲区大小。 返回为0即成功,否则失败。 使用   
Qt君
2020/04/17
2.2K0
为sourceinsight添加makefile和configure文件
在用sourceinsight查看ffmpeg源码的时候,大家会发现不能查看源码中的makefile代码,即不能搜索到makefile文件。这是因为source insight默认是不选makefile的,也没有configure这种类型的文件。下面就说如何让sourceinsight支持查看makefile和configure代码:
雪影
2018/08/02
1.1K0
年薪百万的机器学习专家,为什么不产生价值?
本文转载自第四范式知乎专栏,量子位已获得授权。 「范式大学系列课程」第 3 篇文章: 年薪百万的机器学习专家,为什么不产生价值? Part 1 一个朋友的企业,他们招聘了 2 名机器学习方向的数据科学
量子位
2018/03/30
6470
年薪百万的机器学习专家,为什么不产生价值?
点击加载更多

相似问题

简单的makefile不产生输出文件(正确)

11

解析不产生预期输出

13

函数不产生预期输出

13

DFS方法不产生预期输出

10

Java - cast不产生预期的输出

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文