Angular 单元测试(?)带测试台的6角组件

Angular 单元测试(?)带测试台的6角组件,angular,unit-testing,integration-testing,angular-components,testbed,Angular,Unit Testing,Integration Testing,Angular Components,Testbed,当使用测试床时,您真的是在对组件进行单元测试还是在进行集成测试 创建一个fixture(TestBed.createComponent(AppComponent))并调用fixture.detectChanges()自动调用ngOnInit。如果您想测试另一种方法,您现在正在测试多个单元 这引出了另一个问题:您是应该测试单元,还是应该测试用户操作?例如,您应该测试方法setDimensions,还是应该测试当用户单击某个按钮时,元素是否具有适当的维度 我想第一种测试方法更接近于“单元测试”方法,

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

创建一个fixture(
TestBed.createComponent(AppComponent)
)并调用
fixture.detectChanges()
自动调用
ngOnInit
。如果您想测试另一种方法,您现在正在测试多个单元

这引出了另一个问题:您是应该测试单元,还是应该测试用户操作?例如,您应该测试方法
setDimensions
,还是应该测试当用户单击某个按钮时,元素是否具有适当的维度

我想第一种测试方法更接近于“单元测试”方法,但是您仍然需要处理被调用组件的生命周期方法。这让我觉得没有办法使用
TestBed
对组件进行单元测试。截取所有生命周期方法似乎很荒谬

无论您决定以何种方式进行测试,您都应该测试DOM,不是吗?那么,您不是通过包含DOM api来单独测试。

引用自:

组件不同于角度应用程序的所有其他部分, 组合HTML模板和TypeScript类。组件真正 模板和类是否一起工作。并进行充分测试 作为一个组件,您应该测试它们是否按预期协同工作

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

角度测试台有助于进行此类测试,如中所示 以下各节。但在许多情况下,测试组件类 在没有DOM参与的情况下,可以单独验证组件的大部分功能 以更简单、更明显的方式进行行为

因此这里,单元是一个组件(模板和类一起工作)。您应该尝试通过截取输入和依赖项来测试组件


我想,如果你从上到下阅读一次测试文档,你就有了问题的答案。

以下是更多信息,这些信息是从

对于TDD,一个单元通常定义为一个类,或一组相关函数,通常称为模块。据称,将单位保持在相对较小的范围内可提供关键利益[……]

因此,单元测试并不一定要测试尽可能最小的单元

由于大量使用单元测试,测试驱动开发无法在需要进行全功能测试以确定成功或失败的情况下执行充分的测试。[21]例如用户界面、与数据库一起工作的程序,以及一些依赖于特定网络配置的程序。TDD鼓励开发人员将最少的代码放入此类模块中,并最大化可测试库代码中的逻辑,使用赝品和模拟来表示外部世界。[22]

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

单元测试之所以这样命名,是因为它们每个测试一个代码单元。一个复杂的模块可能有一千个单元测试,而一个简单的模块可能只有十个单元测试。用于TDD的单元测试决不能跨越程序中的进程边界,更不用说网络连接了。这样做会带来延迟,使测试运行缓慢,并阻止开发人员运行整个套件。引入对外部模块或数据的依赖也会将单元测试转变为集成测试。如果一个模块在一系列相互关联的模块中出现错误行为,那么在何处查找故障原因还不是很清楚


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

在调用包含相关组件的“集成测试”之前,您应该考虑这一点。我不确定集成测试是否必须涉及系统的外部部分(如DB),而不是单元测试。你给我的答案中的这条评论反映了我的想法:“单元测试的描述非常好,但你是否考虑到成对集成不包括整个应用程序,只包括两个可测试单元”。那么你是说我的问题中描述的一个测试,使用
TestBed
断言DOM是一个单元测试,或者在单元测试和集成测试之间可能存在一条灰色线,可以将其视为其中之一?集成测试应该测试应用程序的不同部分是否协同工作,因此可以认为测试组件(是类和模板/DOM的组合)实际上是一个集成测试。你真的能说一个测试就是一个单元测试,因为一个单元正在被测试吗?单元测试不应该测试最小的单元吗?组件绝对不是最小的单元。那么,单位的规模/范围是否主观?什么是单位?模块是一个单元吗?是的,在某些情况下模块是一个单元。通过查看测试的基本原理而不是单元的大小或复杂性,可以更好地理解测试是单元还是集成,即测试的重点是单元的功能或单元之间传递的消息。我想你一定是坚持认为纯函数是唯一可能的合法测试单元。看看谢谢你的回复,我读了维基百科的文章。如果一个模块可以是一个单元,而一个组件可以是一个单元(它是模块的一部分),那么以验证其功能为目标的模块测试也将测试组件(也是单元)之间的消息传递。因此,如果您不测试最小的单元,您将