Haz3
Haz3

Reputation: 38

Python Mock function return always False

I try to add unit test in python in function that save stats in a file

Here is the function for saving

def save_file_if_necessary(file_path, content, current_time, mode="w", delta_time=60, force=False):
    if file_path not in file_save or current_time - file_save[file_path] >= delta_time or force:
        with codecs.open(file_path, mode, encoding="utf-8") as written_file:
            written_file.write(content)
            file_save[file_path] = time.time()
            print "yes"
            return True
    else:
        print "not necessary"
        return False

I make a call of this function like that

def test_function():
    bot_url_dic = {"seven1": 10,
                   "seven2": 20
                  }
    save_file_if_necessary(os.path.join("./", "recipients.bots"),json.dumps(bot_url_dic, ensure_ascii=False, indent=4), time.time())

And i made some unittest with mock to test if the function is called

from test import save_file_if_necessary, test_function

    def test_call_save_file_if_necessary(self):
        """test function to test add in list."""
        ip_dic = ["seven1", "seven2", "seven3"]
        save_file_if_necessary = Mock()

        test_function()
        self.assertTrue(save_file_if_necessary.called)

But the problem is Mock is always return False but the function is called at least one time.

self.assertTrue(save_file_if_necessary.called)
AssertionError: False is not true

(python version 2.7.6)

Upvotes: 2

Views: 3522

Answers (2)

Daniel Roseman
Daniel Roseman

Reputation: 599490

All you've done is create a new Mock object, coincidentally called "save_file_if_necessary". You haven't done anything to replace the actual function with your mock.

You need to use the patch functionality to actually do that:

@mock.patch('my_test_module.save_file_if_necessary')
def test_call_save_file_if_necessary(self, mock_function):
    ip_dic = ["seven1", "seven2", "seven3"]

    test_function()
    self.assertTrue(mock_file.called)

Upvotes: 3

alecxe
alecxe

Reputation: 473803

You need to import the module where the function is defined and assign a Mock to your function:

import test

def test_call_save_file_if_necessary(self):
    """test function to test add in list."""
    ip_dic = ["seven1", "seven2", "seven3"]
    test.save_file_if_necessary = Mock()

    test.test_function()
    self.assertTrue(test.save_file_if_necessary.called)

Or, use the patching function instead.

Upvotes: 2

Related Questions