简体   繁体   中英

How to use unittest.mock to mock arbitrary ConfigParser calls in a unit test

I'm trying to start using unittest.mock 's action/assert pattern instead of mox 's record/replay/verify pattern.

# foo.py
def op_1(param):
    pass

def op_2(param):
    pass

def do_stuff(param_1, param_2):
    global config
    global log
    try:
        op_1(param_1)
        if config.getboolean('section','option'):
            op_2(param_2)
    except:
         log.error("an error occured")

And, here's an example of what my unittest file looks like.

# test_foo.py
class TestFoo(unittest.TestCase):
    def test_do_stuff(self):
        param_1 = None
        param_2 = None
        foo.config = MagicMock()
        foo.config.getboolean('section','option', return_value = True)
        foo.op_1 = MagicMock()
        foo.op_2 = MagicMock()
        do_stuff(param_1, param_2)
        foo.op_1.assert_called_once_with(param_1)
        foo.op_2.assert_called_once_with(param_2)
        foo.config.getboolean.assert_called_once_with('section','option')

Does this test to verify the items below/am I using mock right?

  1. do_stuff call returned without error
  2. op_1 was called with param_1
  3. op_2 was called with param_2
  4. config parser object had been used, but the specific calls don't matter

It turns out that I was using the return_value wrong.

When I need a mock.Mock or mock.MagicMock object to return a value, it will need to always return that value, regardless of the arguments passed. Though, it might be nice to give different behavior based on arguments passed ( possible feature request ).

The way I completed this was:

foo.config.getboolean = mock.MagicMock(return_value = True)

And then I can do this:

self.assertGreaterThan(len(foo.config.mock_calls), 0)
self.assertGreaterThan(len(foo.config.getboolean(str(),str())), 0)

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