我有一组动作,它们共享一些基本检查。我的代码如下:
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的每个子类编写测试,可能有很多情况。这也意味着子类的耦合测试和基类方法的测试。在
如果您想在基类中保留逻辑,请参阅Martijn Pieters的答案。在
但是,一种可能是重新构造代码,使验证发生在不属于基类的函数/类中。也许实际运行动作的类可以检查这些。。。在
单元测试操作更简单(您不需要担心基本逻辑),而且如果“BaseAction”被破坏了,它也不会破坏所有的“跳转”单元测试。”run_action”(如果愿意,可以将其设为类而不是函数)本身可以非常容易地测试(您可以创建一个假的“action”对象)。在
您需要对
is_valid()
函数本身进行单元测试。然后,您只需测试在传递无效输入时,.run()
会引发ValueError
异常:由于您已经为
is_valid()
本身准备了一个unittest,因此.run()
的unittests不需要关注它的功能。您可以专注于.run()
特有的功能。在在您的例子中,
^{pr2}$BaseAction
是一个为子类提供服务的单元;我将其作为模拟子类进行测试:因此您可以检查
run
是否确实使用预期的param
值调用了do_run
。在相关问题 更多 >
编程相关推荐