单元测试(?)带有TestBed

时间:2018-05-22 19:52:33

标签: angular unit-testing integration-testing angular-components testbed

使用TestBed时,您是真的对组件进行单元测试还是进行集成测试?

创建工具(TestBed.createComponent(AppComponent))并致电fixture.detectChanges()会自动调用ngOnInit。如果你想测试另一种方法,你现在正在测试多个单位。

这导致了另一个问题:您应该测试单位,还是应该测试用户操作?例如,如果您正在测试方法setDimensions,或者您应该测试当用户点击某个按钮时,元素具有适当的尺寸等。

我猜测试的第一种方式是更接近单位测试"方式,但是你仍然需要处理被调用组件的生命周期方法。这让我觉得没有办法使用TestBed对组件进行单元测试。对所有生命周期方法进行划分似乎很荒谬。

无论你决定测试哪种方式,你都应该测试DOM,不是吗?然后,您不会通过包含DOM api来单独测试。

2 个答案:

答案 0 :(得分:1)

引自Angular docs

  

一个组件,与Angular应用程序的所有其他部分不同,   结合了HTML模板和TypeScript类。该组件真的   是模板和类一起工作。并充分测试   一个组件,您应该测试它们是否按预期一起工作。

     

此类测试需要在中创建组件的主机元素   浏览器DOM,如Angular所做,并调查组件类   与模板描述的DOM交互。

     

Angular TestBed可以帮助您进行此类测试,如您所见   以下部分。但在许多情况下,测试组件类   单独,没有DOM参与,可以验证大部分组件   行为更容易,更明显。

所以在这里,单元是一个组件模板和类一起工作)。您应该尝试通过存根输入和依赖项来测试组件。

我想如果您从上到下阅读测试文档一次,那么您就可以在那里找到答案。

答案 1 :(得分:0)

以下是从Test Driven Development Wikipedia page收集的更多信息。

  

对于TDD,单元通常被定义为一个类,或一组通常称为模块的相关函数。声称保持相对较小的单位可提供关键利益[...]

因此单元测试不一定能测试最小的单元。

  

由于大量使用单元测试,在需要进行全功能测试以确定成功或失败的情况下,测试驱动开发不会执行足够的测试。[21]这些示例包括用户界面,使用数据库的程序以及一些依赖于特定网络配置的程序。 TDD鼓励开发人员将最少量的代码放入这些模块中,并最大化可测试库代码中的逻辑,使用假货和模拟来代表外部世界。[22]

UI可以通过单元测试来测试,直到某个收益递减点,这是功能测试/ e2e测试有用的时候。

  

单元测试是如此命名的,因为它们每个都测试一个代码单元。复杂模块可能有一千个单元测试,一个简单模块可能只有十个。用于TDD的单元测试不应该跨越程序中的进程边界,更不用说网络连接。这样做会导致延迟,使测试运行缓慢,并阻碍开发人员运行整个套件。引入对外部模块或数据的依赖性也会将单元测试转变为集成测试。如果一个模块在一系列相互关联的模块中行为不正常,那么就不能立即明确在哪里寻找失败的原因。

我想我现在将集成测试定义为也测试应用程序外部部分的测试,例如DB或服务器API等其他进程。