据我了解,单元测试的重点是隔离测试代码单元。这意味着:
- 它们不应被代码库中其他地方不相关的代码更改破坏。
- 与集成测试相反(集成测试可能会中断),只有一个单元测试应该通过被测试单元中的错误来破坏。
所有这些暗示着,应该模拟掉测试单元的所有外部依赖关系。我的意思是所有外部依赖关系,而不仅仅是网络,文件系统,数据库等“外部层”。
这得出一个合理的结论,几乎每个单元测试都需要模拟。另一方面,谷歌对嘲笑的快速搜索显示了成千上万的文章声称“嘲笑是一种代码味道”,应该(尽管不完全)避免。
现在,到问题。
- 单元测试应如何正确编写?
- 它们和集成测试之间的界线到底在哪里?
更新1
请考虑以下伪代码:
class Person {
constructor(calculator) {}
calculate(a, b) {
const sum = this.calculator.add(a, b);
// do some other stuff with the `sum`
}
}
可以在Person.calculate
不模拟Calculator
依赖关系的情况下测试该方法的测试(假定,它Calculator
是不访问“外部世界”的轻量级类)可以视为单元测试吗?