如何对方法对象中的方法进行单元测试?

时间:2010-05-06 21:10:50

标签: python unit-testing refactoring tdd

我执行了Replace Method with Method Object描述的“Beck”重构。

现在,我有一个带有“run()”方法的类和一堆将计算分解为更小单元的成员函数。我如何测试这些成员函数?

我的第一个想法是我的单元测试基本上是“run()”方法的副本(具有不同的初始化),但是在每次调用成员函数之间都有断言来检查计算的状态。

(我正在使用Python和unittest模块。)

class Train: 

    def __init__(self, options, points): 
        self._options = options 
        self._points = points 
        # other initializations

    def run(self): 
        self._setup_mappings_dict() 
        self._setup_train_and_estimation_sets() 
        if self._options.estimate_method == 'per_class': 
            self._setup_priors() 
        self._estimate_all_mappings() 
        self._save_mappings() 

    def _estimate_all_mappings(): 
        # implementation, calls to methods in this class

    #other method definitions

作为run()方法实现的一部分,我绝对期望在调用不同方法之前和之后成员属性的状态应该是什么。我应该对这些“私人”属性做出断言吗?我不知道如何对这些方法进行单元测试。

另一个选择是我真的不应该测试这些。

2 个答案:

答案 0 :(得分:10)

我会回答我自己的问题。经过一番阅读和思考,我相信我不应该对这些私有方法进行单元测试。我应该测试公共接口。如果进行内部处理的私有方法足够重要,可以独立测试,而不仅仅是当前实现的巧合,那么这或许表明它们应该重构为一个单独的类。

答案 1 :(得分:6)

我喜欢你的答案,但我不同意。

您将使用此设计模式的情况是正在进行相当复杂的操作的情况。因此,我非常希望能够验证这种操作的各个组成部分。

然后您就其他资源的依赖性问题(在这种情况下可能会或可能不会)。

你需要能够使用某种形式的ioc来注入某种形式的模拟来隔离这个类。

除了大多数模拟框架之外,还会为您提供访问私有成员的访问权限。