Jeremy Barnes
Jeremy Barnes

Reputation: 662

Python Unittest throws uncaught TypeError: __init__() takes 1 positional argument but 2 were given

I am trying to create my first automated test suite with unittest for the first time.

However, when I try to execute my test suite, unittest throws the following exception:

Traceback (most recent call last):

File "testing_pos_line.py", line 31, in <module>
    unittest.main()
  File "C:\Users\barnej78\AppData\Local\Continuum\Anaconda3\lib\unittest\main.py", line 93, in __init__
    self.parseArgs(argv)
  File "C:\Users\barnej78\AppData\Local\Continuum\Anaconda3\lib\unittest\main.py", line 140, in parseArgs
    self.createTests()
  File "C:\Users\barnej78\AppData\Local\Continuum\Anaconda3\lib\unittest\main.py", line 144, in createTests
    self.test = self.testLoader.loadTestsFromModule(self.module)
  File "C:\Users\barnej78\AppData\Local\Continuum\Anaconda3\lib\unittest\loader.py", line 123, in loadTestsFromModule
    tests.append(self.loadTestsFromTestCase(obj))
  File "C:\Users\barnej78\AppData\Local\Continuum\Anaconda3\lib\unittest\loader.py", line 92, in loadTestsFromTestCase
    loaded_suite = self.suiteClass(map(testCaseClass, testCaseNames))
  File "C:\Users\barnej78\AppData\Local\Continuum\Anaconda3\lib\unittest\suite.py", line 24, in __init__
    self.addTests(tests)
  File "C:\Users\barnej78\AppData\Local\Continuum\Anaconda3\lib\unittest\suite.py", line 57, in addTests
    for test in tests:
TypeError: __init__() takes 1 positional argument but 2 were given

If I misname my testcases to begin with a capital T, unittest runs correct, but does not apply any tests to my code.

My code is as follows:

import unittest
from regional_pos_line import Regional_pos_line as Rpl
class Testpos_line__split_columns_callback(unittest.TestCase):
    def __init__(self):
        pass
    def test_UT22_replace_end_row(self):
        self.line.split_columns_callback(self, 4, self.junk_function, 4, replace = True)
        self.assertEqual(self.line.data, [0,1,2,3,5])
    def test_UT23_replace_mid_row(self):
        self.line.split_columns_callback(self, 1, self.junk_function, 4, replace = True)
        self.assertEqual(self.line.data, [0,5,2,3,4])
    def test_UT24_replace_start_row(self):
        self.line.split_columns_callback(self, 0, self.junk_function, 4, replace = True)
        self.assertEqual(self.line.data, [5,1,2,3,4])
    def test_UT25_no_replace_end_row(self):
        self.line.split_columns_callback(self, 5, self.junk_function, 4, replace = False)
        self.assertEqual(self.line.data, [0,1,2,3,4,5])
    def test_UT26_no_replace_mid_row(self):
        self.line.split_columns_callback(self, 1, self.junk_function, 4, replace = True)
        self.assertEqual(self.line.data, [0,5,1,2,3,4])
    def test_UT27_no_replace_start_row(self):
        self.line.split_columns_callback(self, 0, self.junk_function, 4, replace = True)
        self.assertEqual(self.line.data, [5,0,1,2,3,4])
    def setUp(self):
        self.line = Rpl([0,1,2,3,4])
    def tearDown(self):
        del self.line
    def junk_function(self, x):
        return 5
if __name__ == '__main__':
    unittest.main()

What am I doing wrong?

Upvotes: 11

Views: 11041

Answers (3)

Sjoerd van den Bos
Sjoerd van den Bos

Reputation: 11

In some cases, it might be preferable to customize your own init() function since this runs only once per TestCase instead of once for every test method like setUp() and tearDown().

def __init__(self, *args, **kwargs)
super().__init__(*args, **kwargs)
# Add your custom init lines.

This solved the issue for me, I hope it helps for anyone coming across this problem.

Upvotes: 1

arthur
arthur

Reputation: 41

In this case you can just remove your init function, since you just pass it.

In other cases where you'd like to use an init function in your unittests, use

def setUp(self):

instead of

def __init__(self):

The setUp function will be automatically called by unittests. See Python docs for more info.

Upvotes: 4

KHL
KHL

Reputation: 314

Try removing init function. It looks like you don't need it.

Upvotes: 17

Related Questions