1

我是 Python 的初学者,开始在 Python 中设计单元测试,我需要在运行测试类之前向服务器发布一些消息(因为它会搜索它们)。因此我需要调用一个非静态方法postMessages()

我得到的错误的堆栈跟踪是这个 -

    Error
Traceback (most recent call last):
  File ".../TestMsgs.py", line 23, in setUpClass
    instance = cls()
  File ".../python2.7/unittest/case.py", line 191, in __init__
    (self.__class__, methodName))
ValueError: no such test method in <class 'TestMsgs.TestMsgs'>: runTest

我在代码中有这样的东西:

class A(object):

    def postMessages(self):
        print "i post messages in the server!"

class B(A):

    @classmethod
    def setUpClass(cls):
        cls.foo()  # should post messages for the tests in the class to work on

目前没有选择使 foo 成为静态的。如何在 postMessages() 中实例化 B(或 A,就此而言),以便我可以在 setUpClass() 中使用它?

4

1 回答 1

3

在通读__init__TestCase 的方法后,我发现您需要为其提供一个测试方法名称。默认值为“runTest”,这就是弹出该错误的原因。

import unittest 

class A(unittest.TestCase):

    def postMessages(self):
        print "i post messages in the server!"

class B(A):

    @classmethod
    def setUpClass(cls):
        cls.foo(cls(methodName='test_method')) # should post messages for the tests in the class to work on

    def foo(self):
        self.postMessages()

    def test_method(self):
        pass


B.setUpClass()

您可以在此处看到它在交互式 Python 控制台中运行。它将打印出“我在服务器中发布消息!”

在unittest 的源代码中可以清楚地看到您需要在类中传递有效方法名称的原因:

class TestCase: 
    """A class whose instances are single test cases.""" 

    def __init__(self, methodName='runTest'): 
        """Create an instance of the class that will use the named test 
           method when executed. Raises a ValueError if the instance does 
           not have a method with the specified name. 
        """ 
        try: 
           self._testMethodName = methodName 
           testMethod = getattr(self, methodName) 
           self._testMethodDoc = testMethod.__doc__ 
           except AttributeError: 
               raise ValueError, "no such test method in %s: %s" % \ 
                   (self.__class__, methodName) 

如果您想将参数传递给刚刚传入的方法,那么您需要执行类似的操作

class A(unittest.TestCase):

    def foo(self, arg1):
        pass

a = A(methodName='foo')
a.foo('an_argument')

但这整个问题感觉真的不对。您应该重构而不是让静态方法调用实例方法。这很愚蠢。

于 2013-03-25T11:04:54.367 回答