我目前正在尝试创建一些类来进行一些傅立叶变换。我试图通过首先创建一些单元测试,然后构建基本功能来做到这一点。
问题在于,我可以编写一个测试来查看算法是否有效,并且我知道预期的结果。然后我开始构建大算法,如果它有效,我的单元测试将通过。
我的问题是,它不是真正的 TDD。因为通常您创建测试来测试一个类的一个非常基本的特性。现在我的班级基本上执行一个大算法,我无法测试算法的较小部分,因为它们不是公共的(我一直被告知你永远不想测试私有方法)。
你如何处理这个问题?
我目前正在尝试创建一些类来进行一些傅立叶变换。我试图通过首先创建一些单元测试,然后构建基本功能来做到这一点。
问题在于,我可以编写一个测试来查看算法是否有效,并且我知道预期的结果。然后我开始构建大算法,如果它有效,我的单元测试将通过。
我的问题是,它不是真正的 TDD。因为通常您创建测试来测试一个类的一个非常基本的特性。现在我的班级基本上执行一个大算法,我无法测试算法的较小部分,因为它们不是公共的(我一直被告知你永远不想测试私有方法)。
你如何处理这个问题?
我看到了两种可能的方法:
我最近一直在与“什么是单位?”作斗争。这确实是一个棘手的问题。
如果你有理由相信 FFT 的子单元特别容易出错,那么就设置边界条件并打破私有方法可以豁免的规则。
另一种说法是,子单元实际上是一个其服务被 FFT 使用的单元,那么你就没有违反任何规则。
那么如果你的类只有一个可测试的方法(根据你只测试公共方法的标准),那么你别无选择,只能测试那个方法,对吧?然而,这并不意味着它不是 TDD——您当然可以测试大量的输入值。这里的大部分工作将是找到有趣的值——你的转换可能失败的边缘情况是什么?是否有任何无效输入以及如何处理?
是否有某种方法可以对许多值进行算法验证,例如调用已知良好的例程,使用一些与傅立叶相关的关键识别,或者使用 FFT 进行乘法?
我认为,如果您无法测试算法的各个组件,那么代码要么非常紧密耦合,要么代码非常程序化。
您可能必须将代码定义为单元并将这些单元设置为受保护的方法。只要方法受到保护,它就会发送一条明确的消息,表明它不是 API 的一部分。