gpt4 book ai didi

python - 从 TestCase 派生一个类会引发两个错误

转载 作者:IT老高 更新时间:2023-10-28 22:17:07 26 4
gpt4 key购买 nike

我有一些基本的设置/拆卸代码,我想在一大堆单元测试中重用它们。所以我有了创建一些派生类以避免在每个测试类中重复代码的好主意。

这样做时,我收到了两个奇怪的错误。一,我解决不了。这是一个无法解决的问题:

AttributeError: 'TestDesktopRootController' object has no attribute '_testMethodName'

这是我的基类:

import unittest
import twill
import cherrypy
from cherrypy._cpwsgi import CPWSGIApp


class BaseControllerTest(unittest.TestCase):

def __init__(self):
self.controller = None

def setUp(self):
app = cherrypy.Application(self.controller)

wsgi = CPWSGIApp(app)

twill.add_wsgi_intercept('localhost', 8080, lambda : wsgi)

def tearDown(self):
twill.remove_wsgi_intercept('localhost', 8080)

这是我的派生类:

import twill
from base_controller_test import BaseControllerTest

class TestMyController(BaseControllerTest):

def __init__(self, args):
self.controller = MyController()
BaseControllerTest.__init__(self)

def test_root(self):
script = "find 'Contacts'"
twill.execute_string(script, initial_url='http://localhost:8080/')

另一个奇怪的错误是:

TypeError: __init__() takes exactly 1 argument (2 given)

对此的“解决方案”是将单词“args”添加到派生类中的 __init__ 函数中。有什么办法可以避免吗?

记住,我有两个错误。

最佳答案

这是因为您错误地覆盖了 __init__()。几乎可以肯定,您根本不想覆盖 __init__();你应该在 setUp() 中做所有事情。我已经使用 unittest 超过 10 年了,我认为我从未覆盖过 __init__()

但是,如果您确实需要重写 __init__(),请记住您无法控制调用构造函数的位置——框架会为您调用它。所以你必须提供一个它可以调用的签名。从源代码(unittest/case.py)来看,该签名是:

def __init__(self, methodName='runTest'):

这样做的安全方法是接受任何参数并将它们传递给基类。这是一个有效的实现:

class BaseTest(unittest.TestCase):
def __init__(self, *args, **kwargs):
unittest.TestCase.__init__(self, *args, **kwargs)

def setUp(self):
print "Base.setUp()"

def tearDown(self):
print "Base.tearDown()"


class TestSomething(BaseTest):
def __init__(self, *args, **kwargs):
BaseTest.__init__(self, *args, **kwargs)
self.controller = object()

def test_silly(self):
self.assertTrue(1+1 == 2)

关于python - 从 TestCase 派生一个类会引发两个错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7562775/

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