简体   繁体   中英

How to mock a function with specific parameter and return value that calls another function in python unit test?

i am new to python unit testing. Want to mock a function that calls other functions.

Here is my function that i want to mock

def has_groups(self, group_names):
        auth_user_id = AuthUser.get_by_email(self.userEmail).id
        auth_user_groups = AuthUserGroups.get_group_by_user_id(auth_user_id)
        for auth_user_group in auth_user_groups:
            if auth_user_group.group.name in group_names:
                return True
        return False

has_groups should return True only when it get's 'Admin' as parameter.

Here is my test

def my_test(self):
    uid = self.auth_user.get_by_email = Mock(return_value=73)
    groups = AuthUserGroups.get_group_by_user_id = Mock(uid, return_value='Admin')
    self.auth_user.has_groups = Mock(groups, return_value=True)

but it's not working fine. I will appreciate if anyone help me

Can i use patch decorator for this and how?

As I understand your has_groups function is method. I think it's better to mock whole class or independent function. On this situation you could mock AuthUserGroups , method return value and patch module with has_groups method implementation. So you'll have test like this:

from unittest import mock

def my_test(self):
    group = mock.MagicMock()
    group.group.name = 'Admin'

    fake_auth_user_groups = mock.MagicMock()
    fake_auth_user_groups.get_group_by_user_id.return_value = [group]

    with mock.patch('your_module.AuthUserGroups', fake_auth_user_groups):
        self.auth_user.has_groups(['Admin'])

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM