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

TestCaseのメソッドを読んだ後__init__、テストメソッド名を指定する必要があることがわかりました。デフォルトは「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 に答える