Skip to main content
 首页 » 编程设计

python之Django REST单元测试TypeError : __init__() takes 1 positional argument but 2 were given

2025年05月04日24telwanggs

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

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

据我所知,我只是将 self 传递给 __init__ 方法,这个额外的 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 

请您参考如下方法:

不要覆盖TestCase 的__init__ 方法来在数据库中设置测试数据。使用 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)