Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python NameError: global name 'assertEqual' is not defined

I'm following Learn Python the Hard Way and I'm on Exercise 47 - Automated Testing (http://learnpythonthehardway.org/book/ex47.html)

I am using Python3 (vs the book's use of Python 2.x) and I realize that assert_equals (which is used in the book) is deprecated. I am using assertEqual.

I am trying to build a test case but for some reason, when using nosetests in cmd, I get the error: NameError: global name 'assertEqual' is not defined

Here is the code:

from nose.tools import *
from ex47.game import Room



def test_room():
    gold = Room("GoldRoom",
        """ This room has gold in it you can grab. There's a
            door to the north. """)
    assertEqual(gold.name, "GoldRoom")
    assertEqual(gold.paths, {})

def test_room_paths():
    center = Room("Center", "Test room in the center.")
    north = Room("North", "Test room in the north.")
    south = Room("South", "Test room in the south.")

    center.add_paths({'north': north, 'south': south})
    assertEqual(center.go('north'), north)
    assertEqual(center.go('south'), south)

def test_map():
    start = Room("Start", "You can go west and down a hole")
    west = Room("Trees", "There are trees here. You can go east.")
    down = Room("Dungeon", "It's dark down here. You can go up.")

    start.add_paths({'west': west, 'down': down})
    west.add_paths({'east': start})
    down.add_paths({'up': start})

    assertEqual(start.go('west'), west)
    assertEqual(start.go('west').go('east'), start)
    assertEqual(start.go('down').go('up'), start)

I've tried searching GitHub for any solutions, and I'm just not sure why it's giving me the NameError and how would I go about fixing it.

like image 698
auro Avatar asked Jul 22 '13 03:07

auro


4 Answers

You can use assertEqual in python 3 with the help of unittest Library.

import unittest

class TestBalanceCheck(unittest.TestCase):

    def test(self,sol):
        self.assertEqual(sol('[](){([[[]]])}('),False)
        self.assertEqual(sol('[{{{(())}}}]((()))'),True)
        self.assertEqual(sol('[[[]])]'),False)
        print('ALL TEST CASES PASSED')
    
t = TestBalanceCheck()
t.test(balance_check)`

Make sure assertEqual is inside unittest.Testcase

like image 61
Priyank Thakur Avatar answered Sep 20 '22 12:09

Priyank Thakur


Had a similar problem with the second module in a python selenium test script. Solved it by including 'self.' before the 'assertIn'.

Before:

assertIn('images/checkbox-checked.png', ET)

After:

self.assertIn('images/checkbox-checked.png', webelement)
like image 10
user8636702 Avatar answered Oct 22 '22 23:10

user8636702


assertEqual is a method of unittest.TestCase class, so you can only use it on objects that inherit from that class. Check the unittest documentation.

like image 5
Joop Avatar answered Oct 22 '22 23:10

Joop


Why there is NameError?

Because nose.tools haven't got assertEqual() method. Possibly, you are mixing nose.tools with unittest.

How to avoid it in your case?

As someone said (in comments) nose has got assert_equal:

from nose.tools import *
from ex47.game import Room

def test_room():
    gold = Room("GoldRoom",
        """ This room has gold in it you can grab. There's a
            door to the north. """)
    assert_equal(gold.name, "GoldRoom")
    assert_equal(gold.paths, {})

But, officially it is deprecated. Any usage of it causes DeprecationWarning:

...
Asserts something ...
.../test.py:123:    
DeprecationWarning: Please use assertEqual instead.
  assert_equals(a, b)
ok
...

So, you should use assertEqual from unittest:

import unittest
from ex47.game import Room

class TestGame(unittest.TestCase):
    def test_room(self):
        gold = Room("GoldRoom",
            """ This room has gold in it you can grab. There's a
                door to the north. """)
        self.assertEqual(gold.name, "GoldRoom")
        self.assertEqual(gold.paths, {})

Read the docs here

like image 1
ISD Avatar answered Oct 22 '22 23:10

ISD