单元测试方法wrapp

2024-09-23 22:18:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一组动作,它们共享一些基本检查。我的代码如下:

def is_valid(param): …some pretty complex things unit-tested on their own…

class BaseAction(object):
    def run(self, param):
        if not is_valid(param):
            raise ValueError(…)

        return self.do_run(param)

class Jump(BaseAction):
    def do_run(self, param): …

class Sing(BaseAction):
    def do_run(self, param): …

我应该如何单元测试BaseAction.run执行验证?在

我想我可以单元测试跳。跑以及唱。跑,但为了正确地执行它,我需要为BaseAction的每个子类编写测试,可能有很多情况。这也意味着子类的耦合测试和基类方法的测试。在


Tags: run代码selfparamisdefprettysome
2条回答

如果您想在基类中保留逻辑,请参阅Martijn Pieters的答案。在

但是,一种可能是重新构造代码,使验证发生在不属于基类的函数/类中。也许实际运行动作的类可以检查这些。。。在

class Jump(object):
    def run(self, param):
        ...

def run_action(action, param):
    if not is_valid(param):
        raise ValueError(…)

    return action.run(param)

单元测试操作更简单(您不需要担心基本逻辑),而且如果“BaseAction”被破坏了,它也不会破坏所有的“跳转”单元测试。”run_action”(如果愿意,可以将其设为类而不是函数)本身可以非常容易地测试(您可以创建一个假的“action”对象)。在

您需要对is_valid()函数本身进行单元测试。然后,您只需测试在传递无效输入时,.run()会引发ValueError异常:

with self.assertRaises(ValueError):
    objectundertest.run(invalid_parameter)

由于您已经为is_valid()本身准备了一个unittest,因此.run()的unittests不需要关注它的功能。您可以专注于.run()特有的功能。在

在您的例子中,BaseAction是一个为子类提供服务的单元;我将其作为模拟子类进行测试:

^{pr2}$

因此您可以检查run是否确实使用预期的param值调用了do_run。在

相关问题 更多 >