chiffa
chiffa

Reputation: 2088

Python: know function is called from a unittest?

Is there a way to know in Python if a function is called from the context of a unittest execution or a debugging run?

For the context, I am trying to unittest a code where I use functions that perform a database call. In order to avoid database calls during the test of that function (DB calls are tested separately), I am trying to make the DB IO functions aware of their environement and to mock when they are called within a unittest and log additional variables during a debug run.

My current aproach is to read/write environment variables, but it seems a little bit of an overkill and I think Python must have a better mechanism for that.

Edit: Here is the example of a function I am trying to unittest:

from Database_IO import Database_read

def some_function(significance_level, time_range)
    data = Database_read(time_range)
    significant_data = data > significance_level
    return significant_data

Upvotes: 1

Views: 547

Answers (1)

mnencia
mnencia

Reputation: 3368

In my opinion, if you write your function to behave in a different way when tested, you are not really testing it.

To test the function I'd mock.patch() the database object, and then check it has used correctly in your function.

The most difficult thing when you start using the mock library is to find the correct object to replace.

In your example, if in your_module you import the Database_read object from the Database_IO module, you can test it by using a code similar to the following

with mock.patch('your_module.Database_read') as dbread_mock:
    # prepare the dbread_mock
    dbread_mock.return_value = 10
    # execute a test call
    retval = some_function(3, 'some range')
    # check the result
    dbread_mock.assert_called_with('some range')

Upvotes: 6

Related Questions