bhaskar das
bhaskar das

Reputation: 195

self.assertTrue throwing traceback error in Python 3.x unittesting

I am running a small unittest to check the roman number converter. Here is my code :-

class RomConverter(object):
    def __init__(self):
        self.digital_mapping = {"M":1000, "D":500, "C":100, "L":50, "X":10, "V":5, "I":1}  
    def convert(self, rom_num):
        value = 0    
        for char in rom_num:
            val += self.digital_mapping[char]
            return value

import unittest 
class RomConverterTest(unittest.TestCase):
    def settingUp(self):
        print ("Creating a new RomConverter...")
        self.cvt = RomConverter()
    def tearDown(self):
        print ("Destroying the RomConverter...")
        self.cvt = None
    def test_empty_num(self):
        self.assertTrue(self.cvt.convert("") == 0)
        self.assertFalse(self.cvt.convert("") > 0)
    def test_no_rom_num(self):
        self.assertRaises(TypeError,self.cvt.convert, None) 
if __name__ == "__main__":
    unittest.main() 

But I am getting this message when I run the code :-

Traceback (most recent call last):
  File "receipe2 - Copy.py", line 31, in test_empty_roman_numeral
    self.assertTrue(self.cvt.convert_to_decimal("") == 0)
AssertionError: False is not true

Upvotes: 0

Views: 220

Answers (1)

Jan Zeiseweis
Jan Zeiseweis

Reputation: 3738

I see two problems in your code.

First def settingUp(self): should be def setUp(self):

And the return of def convert(self, rom_num): is indented to much. In result the method does not return 0 incase of an empty string. Here is a working version:

class RomConverter(object):
    def __init__(self):
        self.digital_mapping = {"M":1000, "D":500, "C":100, "L":50, "X":10, "V":5, "I":1}
    def convert(self, rom_num):
        value = 0
        for char in rom_num:
            value += self.digital_mapping[char]
        return value

import unittest
class RomConverterTest(unittest.TestCase):
    def setUp(self):
        print ("Creating a new RomConverter...")
        self.cvt = RomConverter()
    def tearDown(self):
        print ("Destroying the RomConverter...")
        self.cvt = None
    def test_empty_num(self):
        self.assertTrue(self.cvt.convert("") == 0)
        self.assertFalse(self.cvt.convert("") > 0)
    def test_no_rom_num(self):
        self.assertRaises(TypeError,self.cvt.convert, None)

if __name__ == "__main__":
    unittest.main()

Upvotes: 1

Related Questions