使用TestBed
时,您是真的对组件进行单元测试还是进行集成测试?
创建工具(TestBed.createComponent(AppComponent)
)并致电fixture.detectChanges()
会自动调用ngOnInit
。如果你想测试另一种方法,你现在正在测试多个单位。
这导致了另一个问题:您应该测试单位,还是应该测试用户操作?例如,如果您正在测试方法setDimensions
,或者您应该测试当用户点击某个按钮时,元素具有适当的尺寸等。
我猜测试的第一种方式是更接近单位测试"方式,但是你仍然需要处理被调用组件的生命周期方法。这让我觉得没有办法使用TestBed
对组件进行单元测试。对所有生命周期方法进行划分似乎很荒谬。
无论你决定测试哪种方式,你都应该测试DOM,不是吗?然后,您不会通过包含DOM api来单独测试。
答案 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等其他进程。