关于使用模拟与否的争论及其困惑
内容提要
在讨论是否使用模拟时,常忽视细微差别。对于无副作用的语言如Elm或Haskell,只需测试返回值和验收测试副作用。而在TypeScript和Angular等面向对象语言中,通常使用模拟来测试副作用。函数式编程者主张“测试代码而非模拟”,但在允许副作用的语言中,他们可能会使用两种单元测试或存根和验收测试。面向对象开发者则强调测试行为而非实现细节。
关键要点
-
在模拟与不模拟的讨论中,常常忽视细微差别,导致混淆。
-
在Elm或Haskell等无副作用的语言中,不需要使用模拟,只需测试返回值和验收测试副作用。
-
在TypeScript和Angular等面向对象语言中,通常使用模拟来测试副作用,测试代码时往往忽略返回值。
-
函数式编程者主张“测试代码而非模拟”,但在允许副作用的语言中,他们可能会使用两种单元测试或存根和验收测试。
-
面向对象开发者强调测试行为而非实现细节,但在不支持这种测试的语言中,这种观点可能不成立。
-
当函数式编程开发者在非FP语言中工作时,他们可能会采用两种不同的测试方法来处理返回值和副作用。
-
面向对象开发者在语言不支持测试行为时,可能会忽视实现细节的测试。
-
在允许副作用的语言中,测试方法的选择和实现可能会影响代码的可维护性和测试的有效性。
延伸问答
在无副作用的语言中,为什么不需要使用模拟?
在无副作用的语言如Elm或Haskell中,只需测试返回值和验收测试副作用,因此不需要使用模拟。
面向对象语言中使用模拟的原因是什么?
在TypeScript和Angular等面向对象语言中,通常使用模拟来测试副作用,因为这些语言的代码往往忽略返回值。
函数式编程者在非FP语言中如何进行测试?
函数式编程者在非FP语言中通常会采用两种不同的测试方法:一种测试返回值,另一种使用模拟测试副作用。
使用模拟的测试方法有哪些潜在缺陷?
使用模拟的测试方法可能需要更多的代码设置,并且在重构时更容易出现测试失败,因为它们依赖于副作用的抽象。
面向对象开发者如何看待测试行为与实现细节?
面向对象开发者强调测试行为而非实现细节,但在不支持这种测试的语言中,这种观点可能不成立。
在允许副作用的语言中,测试方法的选择会有什么影响?
在允许副作用的语言中,测试方法的选择和实现可能会影响代码的可维护性和测试的有效性。