代码之家  ›  专栏  ›  技术社区  ›  Preston

Django REST unit test TypeError:\uu init\uu()接受1个位置参数,但给出了2个

  •  0
  • Preston  · 技术社区  · 7 年前

    我用命令启动下面的代码 $ python manage.py test ,并返回错误:

    TypeError: __init__() takes 1 positional argument but 2 were given
    

    self __init__ method ,这个额外的arg来自哪里?我查了这里的多个答案,看了 django docs ,但似乎找不到我的错误。

    是什么原因造成的?

    import requests
    import json
    from django.contrib.auth.models import User
    
    from django.test import TestCase
    from django.test import Client
    
    class BasicFunctionality(TestCase):
    
        def __init__(self):
            user_name = 'boris_the_blade'
            password = 'boris_the_sneaky_russian'
            self.client = Client()
            self.login_status = self.createUserAndLogin(user_name, password)
    
        def createUserAndLogin(self, user_name, password):
            self.user = User.objects.create_user(username=user_name, password=password)
            login = self.client.login(username=user_name, password=password)
    
            return login
    
        def test_login(self):
            self.assertTrue(self.login_status)
    

    全端输出:

    Traceback (most recent call last):
    File "manage.py", line 15, in <module>
        execute_from_command_line(sys.argv)
    File "/home/tompreston/.python_virtualenvs/lagoon-back-end-K1-2r-Ad/lib/python3.6/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
        utility.execute()
    File "/home/tompreston/.python_virtualenvs/lagoon-back-end-K1-2r-Ad/lib/python3.6/site-packages/django/core/management/__init__.py", line 375, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
    File "/home/tompreston/.python_virtualenvs/lagoon-back-end-K1-2r-Ad/lib/python3.6/site-packages/django/core/management/commands/test.py", line 26, in run_from_argv
        super().run_from_argv(argv)
    File "/home/tompreston/.python_virtualenvs/lagoon-back-end-K1-2r-Ad/lib/python3.6/site-packages/django/core/management/base.py", line 316, in run_from_argv
        self.execute(*args, **cmd_options)
    File "/home/tompreston/.python_virtualenvs/lagoon-back-end-K1-2r-Ad/lib/python3.6/site-packages/django/core/management/base.py", line 353, in execute
        output = self.handle(*args, **options)
    File "/home/tompreston/.python_virtualenvs/lagoon-back-end-K1-2r-Ad/lib/python3.6/site-packages/django/core/management/commands/test.py", line 56, in handle
        failures = test_runner.run_tests(test_labels)
    File "/home/tompreston/.python_virtualenvs/lagoon-back-end-K1-2r-Ad/lib/python3.6/site-packages/django/test/runner.py", line 603, in run_tests
        suite = self.build_suite(test_labels, extra_tests)
    File "/home/tompreston/.python_virtualenvs/lagoon-back-end-K1-2r-Ad/lib/python3.6/site-packages/django/test/runner.py", line 514, in build_suite
        tests = self.test_loader.discover(start_dir=label, **kwargs)
    File "/usr/lib/python3.6/unittest/loader.py", line 341, in discover
        tests = list(self._find_tests(start_dir, pattern))
    File "/usr/lib/python3.6/unittest/loader.py", line 406, in _find_tests
        yield from self._find_tests(full_path, pattern, namespace)
    File "/usr/lib/python3.6/unittest/loader.py", line 406, in _find_tests
        yield from self._find_tests(full_path, pattern, namespace)
    File "/usr/lib/python3.6/unittest/loader.py", line 398, in _find_tests
        full_path, pattern, namespace)
    File "/usr/lib/python3.6/unittest/loader.py", line 452, in _find_test_path
        return self.loadTestsFromModule(module, pattern=pattern), False
    File "/usr/lib/python3.6/unittest/loader.py", line 123, in loadTestsFromModule
        tests.append(self.loadTestsFromTestCase(obj))
    File "/usr/lib/python3.6/unittest/loader.py", line 92, in loadTestsFromTestCase
        loaded_suite = self.suiteClass(map(testCaseClass, testCaseNames))
    File "/usr/lib/python3.6/unittest/suite.py", line 24, in __init__
        self.addTests(tests)
    File "/usr/lib/python3.6/unittest/suite.py", line 57, in addTests
        for test in tests:
    TypeError: __init__() takes 1 positional argument but 2 were given
    
    1 回复  |  直到 7 年前
        1
  •  11
  •   Alasdair    7 年前

    不要覆盖 __init__ 方法 TestCase 在数据库中设置测试数据。使用 setUp 相反。

    def setUp(self):
        user_name = 'boris_the_blade'
        password = 'boris_the_sneaky_russian'
        self.client = Client()  # Django's TestCase already sets self.client so this line isn't required
        self.login_status = self.createUserAndLogin(user_name, password)