Python:没有这样的测试方法:如何通过从另一个方法显式调用它来执行测试方法?

时间:2013-05-21 19:35:02

标签: python flask

这是我的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

1 个答案:

答案 0 :(得分:9)

Python的unittest模块(Flask在幕后使用)以特殊方式组织代码。

要从派生TestCase的类运行特定的方法,您需要执行以下操作:

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

幕后的任何人都不知道

为了理解为什么必须这样做,您需要了解默认 TestCase对象的工作原理。

通常,在继承时,TestCase期望采用runTest方法:

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

但是,如果您需要多个TestCases,则需要为每个{。}}执行此操作。

由于这是一件单调乏味的事情,他们决定采取以下措施:

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