gpt4 book ai didi

python - 如何检查 TDD 中是否存在方法?

转载 作者:太空宇宙 更新时间:2023-11-03 12:48:25 25 4
gpt4 key购买 nike

在严格的测试驱动开发方法中,每个步骤都需要事先进行测试。即使是类或其方法的存在 - 严格来说 - 在实际创建之前也需要进行测试。

我在编写测试以查看方法是否存在时遇到了问题。

class BasicTests(unittest.TestCase):

def setUp(self):
self.test = RandomGenClass()

def testRandomGenClassExists(self):
""" Does the class exist? """
self.assert_(self.test is not None)

def testMyMethodExists(self):
""" Does MyMethod() exist?"""
result = self.test.myMethod()
self.assert_(result is not None)

在这两种情况下,如果类不存在,Python 就已经失败了。测试永远不会断言。有没有更好的方法来实现这一目标?

最佳答案

类型的存在

有异常(exception)

如果一个类没有被定义,尝试使用它会抛出一个非常具体的错误,所以解决这个问题的一种方法是捕获那个错误(大概在 setUp 中,或者它所在的任何地方)第一次使用),然后就失败了。

def setUp(self):
try:
self.test = RandomGenClass()
except NameError as e:
pass # fail appropriately here.

请记住,这可能会掩盖某些错误的原因:例如,如果 RandomGenClass.__init__ 引发 NameError。因此,对于您的情况,您可能需要更仔细地查看引发的错误,以确保它是未定义的 "RandomGenClass",而不是更深层次的名称。


使用 globals()

因此,也许更好的方法(对于您的用例而言)是在 globals() 返回的字典中查找您希望使用的类的名称,但是我个人认为这有点丑陋,更容易出现问题。不过,它没有屏蔽其他错误的问题。

if not 'RandomGenClass' in globals():
pass # fail appropriately

使用hasattr

如果类存在于其他模块中(可能,但不一定如此),我们可以在模块对象上使用 hasattr,就像我们将测试方法(下面)一样。这可能是总体上最干净的方式。

import some_module
if not hasattr(some_module, 'ClassName'):
pass # fail appropriately

根据类(class)的来源,您实际上可能能够更早地捕捉到它。如果您从定义它们的任何地方导入类,您可以显式地全部导入它们,如果类未定义则查找 ImportError


方法的存在

至于方法测试,那部分很简单。一旦您知道该类存在并且拥有它的一个实例,您就可以使用 hasattr 来确定是否为该对象定义了给定的名称。

if hasattr(self.test, 'method_name'):
result = self.test.method_name()

当然,您也可以使用与测试该类是否存在几乎完全相同的方法来执行此操作:继续执行,并在它爆炸时捕获错误。同样,这需要某种验证,以确保您捕获的属性错误实际上是您要查找的错误。

try:
result = self.test.myMethod()
except AttributeError as e:
pass # fail appropriately

关于python - 如何检查 TDD 中是否存在方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22272882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com