2

これが私のLoginResourceHelperテストクラスです

from flask.ext.testing import TestCase
    class LoginResourceHelper(TestCase):
        content_type = 'application/x-www-form-urlencoded'

        def test_create_and_login_user(self, email, password):
            user = UserHelper.add_user(email, password)
            self.assertIsNotNone(user)

            response = self.client.post('/', content_type=self.content_type,
                                        data=UserResourceHelper.get_user_json(
                                            email, password))
            self.assert200(response)
            # HTTP 200 OK means the client is authenticated and cookie
            # USER_TOKEN has been set

            return user

    def create_and_login_user(email, password='password'):
        """
        Helper method, also to abstract the way create and login works.
        Benefit? The guts can be changed in future without breaking the clients
        that use this method
        """
        return LoginResourceHelper().test_create_and_login_user(email, password)

を呼び出すとcreate_and_login_user('test_get_user')、次のようなエラーが表示されます

 line 29, in create_and_login_user
    return LoginResourceHelper().test_create_and_login_user(email, password)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/case.py", line 191, in __init__
    (self.__class__, methodName))
ValueError: no such test method in <class 'core.expense.tests.harness.LoginResourceHelper.LoginResourceHelper'>: runTest
4

1 に答える 1

9

Python のunittestモジュール (Flask がバックグラウンドで使用している) は、特別な方法でコードを編成します。

派生したクラスから特定のメソッドを実行するTestCaseには、次の手順を実行する必要があります。

LoginResourceHelper('test_create_and_login_user').test_create_and_login_user(email, password)

untitest が舞台裏で行うこと

これを行う必要がある理由を理解するには、デフォルト TestCaseオブジェクトがどのように機能するかを理解する必要があります。

通常、継承TestCaseされると、メソッドを持つことが期待されますrunTest:

class ExampleTestCase(TestCase):
    def runTest(self):
       # Do assertions here

ただし、複数ある必要TestCasesがある場合は、すべての 1 つに対してこれを行う必要があります。

これは面倒なことなので、次のことを決定しました。

class ExampleTestcase(TestCase):
    def test_foo(self):
        # Do assertions here

    def test_bar(self):
        # Do other assertions here

これはテスト フィクスチャと呼ばれます。しかし、 を宣言していないrunTest()ので、TestCase で実行するメソッドを指定する必要があります。これが実行したいことです。

>>ExampleTestCase('test_foo').test_foo()
>>ExampleTestCase('test_bar').test_bar()

通常、unittestモジュールはバックエンドでこれらすべてを行い、その他のことも行います。

  • TestCases をテスト スイートに追加する (通常は TestLoader を使用して行います)
  • 正しい TestRunner を呼び出す (すべてのテストを実行して結果を報告する)

ただし、通常のunittest実行を回避しているため、unitest定期的に行う作業を行う必要があります。

本当に深く理解するには、ドキュメントunittestを読むことを強くお勧めします。

于 2013-05-21T23:35:05.743 に答える