当前位置: 首页 > 面试题库 >

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

瞿子濯
2023-03-14
问题内容

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

这样,我收到了两个奇怪的错误。第一,我无法解决。这是无法解决的一个:

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)

解决方案是__init__在派生类的函数中添加单词“ args” 。有什么办法可以避免这种情况?

记住,我在这一方面有两个错误。


问题答案:

这是因为您__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)


 类似资料:
  • 我理解您可以从派生类访问基类的成员,然而,我有一个函数需要指向我的基类作为一个整体的指针。例如: 有没有办法从派生类中获得指向这个基类的指针?

  • 我想派生一个具有常量和一些琐碎操作的类: 的派生 应该是策略的结果,但不是。

  • 似乎Micronaut不允许从相同基类(实现接口)继承的两个控制器注册到路由器。 下面是我的简化代码,它抛出了同样的异常:然后我得到了这个异常: 这仅适用于一个控制器。如果您从 RestController 中删除接口 RestOperations,它也将起作用。 以Netty...结尾的长堆栈跟踪: 如果您有任何想法,请告诉我。谢谢。

  • 在实践中考虑java并发的片段 同一本书的摘录- 考虑易失性变量的一个好方法是想象它们的行为大致类似于上面清单中的同步整数类,用调用get和set来替换易失性变量的读写。然而,访问易失性变量不执行锁定,因此不会导致执行线程阻塞,这使得易失性变量成为比同步更轻量级的同步机制。 线程限制的一种特殊情况适用于可变变量。对共享的易失性变量执行读-修改-写操作是安全的,只要确保该易失性变量仅从单个线程写入。

  • 问题内容: 返回所有直接实现的接口,即不遍历类树以获取所有父类型的所有接口。例如,层次结构 对于我想得到,但对于任何任意的树深度。 我可以自己写这个,但是我确定必须有一个已经存在的库,有什么想法吗? 问题答案: Apache Commons Lang 具有您需要的方法:

  • 我有一个标记,其中有和。我希望当应用程序在pc中启动时,应用程序使用CSS for,而当应用程序在智能手机中启动时,只使用CSS。 我已经测试过了: 其思想是,当应用程序在pc中时,将是和,而在智能手机中,和将是和