我的茉莉花测试太脆弱了
My jasmine tests are far too brittle
我整个下午都在用谷歌搜索这个问题,但一直在努力寻找可行的解决方案来解决我的问题。
基本上,我已经开始了一些 Angular 开发并且有一个大约 700 行的控制器。我的规范文件大约有 2100 行,我的代码覆盖率为 100%。我发现每当我必须更换控制器时,我都必须修复大约 5 个单元测试。他们没有给我找虫子。
我不使用 TDD 方法,也许这就是问题所在?代码被编写,然后测试被编写。
我问是因为我在网上阅读的任何地方,普遍的共识是单元测试很棒。我只是在任何时候都看不到它们的任何价值,而且它们浪费了我太多时间。
如果有人有任何建议,我将不胜感激。
分离您的顾虑
一个 700 行的控制器和一个 2100 行的规格文件几乎意味着您很少遵守 separation of concerns principle (or the single responsibility principle)。
这是 Angular 中的一个常见问题,开发人员倾向于污染范围和控制器,而不是将责任分配给服务和指令。一个好的做法是让控制器启动范围并提供事件处理程序,但大部分逻辑应该驻留在服务中,除非它特定于控制器的实际视图(可重用视图逻辑进入指令,可重用 'business' 逻辑服役)。
反过来,这通常转化为高级别的依赖性,这在 5 个测试因一次更改而失败的事实中很明显。从理论上讲,适当的单元测试意味着一个单一的改变应该只能让一个单一的测试失败;这在实践中几乎不是这样,因为我们懒惰地模拟一个单元的所有依赖项,但这没什么大不了的,因为一旦我们修复有问题的代码,相关的失败测试就会通过。
非 TDD 测试
有测试但不遵循 TDD 比根本没有测试要好,但不太理想。
测试通常有 3 个目的(3D):
- 设计 - 通过先编写测试,您首先定义单元应该做什么,然后才实现它。
- Defence - 通过编写测试,您可以确保可以更改代码,但不能更改其行为。
- 文档 - 测试作为单元应该做什么的文档:'It should ...'.
除非是 TDD 的一部分,否则您缺少 设计 位和大部分文档位。
事后编写测试通常并不能确保代码正常工作,而是确保它能正常工作。在 post-coding 测试中提供一个特定输入的函数非常诱人,使测试失败但查看实际输出是什么并使此输出成为预期输出 - 这并不意味着输出是正确的, 就是这样。当您先编写测试时不会发生这种情况。
我整个下午都在用谷歌搜索这个问题,但一直在努力寻找可行的解决方案来解决我的问题。
基本上,我已经开始了一些 Angular 开发并且有一个大约 700 行的控制器。我的规范文件大约有 2100 行,我的代码覆盖率为 100%。我发现每当我必须更换控制器时,我都必须修复大约 5 个单元测试。他们没有给我找虫子。 我不使用 TDD 方法,也许这就是问题所在?代码被编写,然后测试被编写。 我问是因为我在网上阅读的任何地方,普遍的共识是单元测试很棒。我只是在任何时候都看不到它们的任何价值,而且它们浪费了我太多时间。
如果有人有任何建议,我将不胜感激。
分离您的顾虑
一个 700 行的控制器和一个 2100 行的规格文件几乎意味着您很少遵守 separation of concerns principle (or the single responsibility principle)。
这是 Angular 中的一个常见问题,开发人员倾向于污染范围和控制器,而不是将责任分配给服务和指令。一个好的做法是让控制器启动范围并提供事件处理程序,但大部分逻辑应该驻留在服务中,除非它特定于控制器的实际视图(可重用视图逻辑进入指令,可重用 'business' 逻辑服役)。
反过来,这通常转化为高级别的依赖性,这在 5 个测试因一次更改而失败的事实中很明显。从理论上讲,适当的单元测试意味着一个单一的改变应该只能让一个单一的测试失败;这在实践中几乎不是这样,因为我们懒惰地模拟一个单元的所有依赖项,但这没什么大不了的,因为一旦我们修复有问题的代码,相关的失败测试就会通过。
非 TDD 测试
有测试但不遵循 TDD 比根本没有测试要好,但不太理想。
测试通常有 3 个目的(3D):
- 设计 - 通过先编写测试,您首先定义单元应该做什么,然后才实现它。
- Defence - 通过编写测试,您可以确保可以更改代码,但不能更改其行为。
- 文档 - 测试作为单元应该做什么的文档:'It should ...'.
除非是 TDD 的一部分,否则您缺少 设计 位和大部分文档位。
事后编写测试通常并不能确保代码正常工作,而是确保它能正常工作。在 post-coding 测试中提供一个特定输入的函数非常诱人,使测试失败但查看实际输出是什么并使此输出成为预期输出 - 这并不意味着输出是正确的, 就是这样。当您先编写测试时不会发生这种情况。