Preston
Preston

Reputation: 8187

Django REST unit test TypeError: __init__() takes 1 positional argument but 2 were given

I'm launching the below code with the command $ python manage.py test, and it's returning the error:

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

As far as I can see I'm only passing self to the __init__ method, where is this additional arg coming from? I've checked multiple answers on here and looked at the django docs, but can't seem to find my error.

What is causing this?

Code:

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)

Full terminal output:

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

Upvotes: 1

Views: 1018

Answers (1)

Alasdair
Alasdair

Reputation: 308849

Don't override the __init__ method of TestCase to set up test data in the database. Use setUp instead.

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)

Upvotes: 11

Related Questions