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需要对每个都执行此操作。

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

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

    def test_bar(self):
        # Do other assertions here

这称为测试夹具。但是由于我们没有声明 a 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 回答