繁体   English   中英

Angular组件单元测试实际上是单元测试吗?

[英]Is Angular component unit testing actually unit testing?

我开始学习单元测试,并且了解主要目标是独立测试系统。 因此,应该对任何依赖项进行存根,模拟等。

根据有关测试的Angular文档,您应该模拟依赖注入提供的任何内容。 到现在为止还挺好。 但是,然后,如下面的代码所示,您只需通过共享或功能模块导入其他所需的模块,组件,指令,管道。

那真的是单元测试吗? 如果要测试的目标系统是一个组件,这不是在测试整个模块吗?

还是这只是在现实世界中模拟所有需求几乎是不可能的?

beforeEach(async(() => {
  const routerSpy = createRouterSpy();

  TestBed.configureTestingModule({
    imports:      [ SharedModule ],
    declarations: [ HeroDetailComponent ],
    providers: [
      { provide: ActivatedRoute, useValue: activatedRoute },
      { provide: HeroService,    useClass: TestHeroService },
      { provide: Router,         useValue: routerSpy},
    ]
  })
  .compileComponents();
}));

那真的是单元测试吗? 如果要测试的目标系统是一个组件,这不是在测试整个模块吗?

单元测试的定义是测试源代码的小单元,而组件实际上是源代码的小单元。

但是,然后,如下面的代码所示,您只需通过共享或功能模块导入其他所需的模块,组件,指令,管道。

可以在JavaScript中测试最小源代码单元是一个纯函数 如果您是最纯粹的人,那么更大的东西不再是最小的单位,但是Angular是面向对象的框架,因此在这种范式下,我们可以说一个对象最小的单位。 因此,单元对象可以覆盖诸如组件,服务,激活器,解析器之类的所有对象。

还是这只是在现实世界中模拟所有需求几乎是不可能的?

在构建系统后尝试测试系统的好运。

如果要构建可以测试的东西,请首先编写测试。

https://zh.wikipedia.org/wiki/测试驱动的发展

纯成分

纯组件是没有外部依赖项的组件,不会使外部状态发生变化并为相同的输入生成相等的输出。 它具有用户形式是纯粹的为同样的方式,一个组件是不可能的new Date()不是纯粹。

单元测试框架了解这些现实问题,并提供模拟 ,间谍等解决方案,以使测试人员能够以可重复的方式验证期望的测试覆盖不纯的源代码。

这就是您所能做的,但这仍然是单元测试,这很重要。

(基于大量意见,因此可以不同意)。这并不是真正针对角度的,例如,如果您正在对使用numpy的Python函数进行单元测试,您仍将numpy导入到UT中。 因此,在这里您可以导入材料组件作为示例,而您并不能真正模拟它们(即使您这样做不是一个好主意,您也要确保正确使用它们)。 基本上,我会在单元测试中说你是嘲笑/磕碰其他功能(heroService这里嘲笑)和HTTP请求的响应,但如预期,所以你仍然导入和使用他们,你只能假设外部库的工作。

你写

主要目的是隔离测试系统

是的-否。 单元测试用于发现在独立软件中发现的错误。 这并不意味着您实际上必须在测试期间隔离代码。 换句话说,您不必模拟所有依赖项。 例如,如果您的代码使用sin()函数,那么这也是对其他代码部分的依赖,但是这种依赖通常不会损害您正确测试代码的能力。

一般规则是,应出于某种原因进行模拟。 有充分的理由是:

  • 您不能轻易使组件依赖(DOC)的行为符合测试的预期。
  • 调用DOC是否会引起任何非专业行为(日期/时间,随机性,网络连接)?
  • 测试设置过于复杂和/或维护密集(例如,需要外部文件)
  • 原始DOC为您的测试代码带来了可移植性问题。
  • 使用原始DOC是否会导致构建/执行时间过长?
  • 是否存在使测试不可靠的DOC稳定性(成熟度)问题,或者更糟糕的是DOC尚不可用?

如您所见,使用sin()函数通常不会属于上述原因。 您将不得不判断这是否也适用于您的方案。

但是,以上观点的一个结论是,如果不模拟所有依赖项,则还可以进行单元测试。 但是-单元测试的显着特征是什么? 将单元测试与例如集成测试区分开来的是您在各个测试中追求的目标。

如果您的目标是查找解决另一个组件问题的方式的错误(例如,如果另一个组件的函数以错误的顺序或使用了错误的参数调用,或者返回值不是预期的形式等),则可以这样做不会进行单元测试,而是进行集成测试:在单独测试组件时,您甚至无法找到这些错误-您需要其他组件才能找到它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM