如何用自己的方法从外部库扩充一个类?

2024-09-27 00:11:25 发布

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

我有一些特殊情况需要在django测试。我试图通过编写自己的测试用例来扩展现有的django测试。以下是我目前的做法。在

from django.tests import TestCase

# define my own method as a function
def assertOptionsEqual(self, first, second):
    # logic here
    pass

# Attach the method to the TestCase class. This feels inelegant!
TestCase.assertOptionsEqual = assertOptionsEqual

# tests go here
class KnownGoodInputs(TestCase):
    def test_good_options(self):
        self.assertOptionsEqual(...)

虽然这样做是可行的,但是将一个方法定义为一个以self作为第一个参数的函数,然后将其附加到TestCase上,感觉不太好。有没有更好的方法用我自己的方法扩充TestCase类?我能做到。。。在

^{pr2}$

并使用MyTestCase进行所有测试,但不知道是否有更好的替代方法。谢谢!在


Tags: thedjango方法fromimportselfheredef
1条回答
网友
1楼 · 发布于 2024-09-27 00:11:25

我想你已经涵盖了这两种选择。您可以使用子类或monkeypatch。通常情况下,monkeypatching,实际上在运行时更改第三方类是不受欢迎的,但这可能是解决错误或确保每次使用该类时都有新方法的唯一方法。在

由于使用您的方法的唯一测试将是您的测试monkeypatching是不必要的,因此将TestCase子类化是非常合理的。通常,当您需要扩充现有类的方法时,您会使用monkeypatching。例如,如果您希望在现有测试用例中对TestCase.assertEqual的调用增加逻辑以与Option对象进行比较,您可以通过执行以下操作来monkeypatch TestCase.assertEqual来包括自定义逻辑和其正常逻辑:

originalAssertEqual = TestCase.assertEqual
def newAssertEqual(self, first, second):
    result = originalAssertEqual(first, second)
    if isinstance(first, Option) and isinstance(second, Option):
        # do your custom comparison
    return result
TestCase.assertEqual = newAssertEqual 

然而,至少在这个例子中,子类和monkeypatches似乎都是不必要的。在

假设问题是调用self.assertEqual(firstOptions, secondOptions)失败,即使Option实例相等,您不需要编写新的assertOptionsEqual方法。您可能只需要您的Option对象来正确定义__eq__。在

所以假设你有:

^{pr2}$

上面的firstsecond的类是什么?在

对于所有Python内置类型,assertEqual应该可以工作。对于自定义的Option类,只需执行以下操作:

类选项(对象): definit(自身): 使用_foo=False 使用条=真

def __eq__(self, other):
    if (self.use_foo == other.use_foo and
        self.use_bar == other.use_bar):
        return True
    return False

然后假设first和{}是Option的实例,您可以编写测试,就像:

class KnownGoodInputs(TestCase):
    def test_good_options(self):
        first, second = systemUnderTestGetOptions(...)
        self.assertEqual(first, second)

相关问题 更多 >

    热门问题