Dave Jesse
Dave Jesse

Reputation: 21

python unittest - how to reference a callable function

OK, I know it's going to be obvious, but I cannot work out how to write a test for an internal function. Here's a trivial piece of code to illustrate the problem.

def high(x, y):
    def low(x):
        return x*2
    return y*low(x)

class TestHigh(unittest.TestCase):
    def test_high(self):
        self.assertEqual(high(1,2),4)

    def test_low(self):
        self.assertEqual(low(3),6)

results in

Exception: NameError: global name 'low' is not defined

In the "real" case I want to be able to test the lower level function in isolation to make sure all the paths are exercised, which is cumbersome when testing only from the higher level.

Upvotes: 1

Views: 751

Answers (3)

Jesse the Game
Jesse the Game

Reputation: 2630

BAD: Try making a class and adding the functions as methods (or staticfunctions) to it.

(I'll leave this here as a reference for what NOT to do.)

GOOD: Write module level functions or accept that you can't test it if you nest it.

Upvotes: 1

Duncan
Duncan

Reputation: 95622

You write tests to ensure that the publicly visible interface performs according to its specification. You should not attempt to write tests for internal functionality that is not exposed.

If you cannot fully test low() through the results of high() then the untested parts of low() cannot matter to anything outside.

Upvotes: 2

Matti John
Matti John

Reputation: 20467

low is nested within the high function, so it's not accessible from outside the function. The equivalent for your function would be high(3,1)

Upvotes: 2

Related Questions