diff options
Diffstat (limited to 'chromium/docs/website/site/chromium-os/python-mock/index.md')
-rw-r--r-- | chromium/docs/website/site/chromium-os/python-mock/index.md | 90 |
1 files changed, 0 insertions, 90 deletions
diff --git a/chromium/docs/website/site/chromium-os/python-mock/index.md b/chromium/docs/website/site/chromium-os/python-mock/index.md deleted file mode 100644 index 371cbe53eb9..00000000000 --- a/chromium/docs/website/site/chromium-os/python-mock/index.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -breadcrumbs: -- - /chromium-os - - Chromium OS -page_name: python-mock -title: python-mock ---- - -The python "mock" library is the preferred mocking library for python unittests -in the Chromium OS source. There still exist many tests that use "mox", but -"mock" is preferred for all new tests. python-mock is the standard mocking -framework starting in Python 3.3 (imported as unittest.mock). - -### Setup - -python-mock is already added to the chroot, but people who run unit tests -outside the chroot need to manually install it. Here are the commands to run: - -```none -sudo apt-get purge python-mock -sudo apt-get install python-pip -sudo pip install mock -``` - -### Summary - -Unlike pymox, python-mock is really easy to extend - no messing with -ReplyAll()'s, VerifyAlls(), etc. It's also more pythonic. Here's a quick snippet -of running a test with somemodule.func() mocked out: - -```none -import somemodule -with patch.object(somemodule, 'func') as mocked_f: - mocked_f.returnvalue = 5 - ret = somemodule.func('arg1', 'arg2') - assertEquals(ret, 5) - mocked_f.assert_called_once_with('arg1', 'arg2') -``` - -### Documentation - -* Take a look at python-mock - [docs](http://www.voidspace.org.uk/python/mock/). -* There's also a - [talk](http://pyvideo.org/video/392/pycon-2011--testing-with-mock) - given by the author on how to test with python-mock. - -### partial_mock.py - -In the chromite source there is a partial mocking library, located at -lib/partial_mock.py. This extends python-mock to allow for writing re-usable -mocks. An example is the cros_build_lib_unittest.RunCommandMock class, which can -be used to easily simulate command line behavior. Here's a code snippet of a -function we want to test: - -```none -def func(): - try: - result = cros_build_lib.RunCommand( - ['./some_command'], redirect_stdout=True, redirect_stderr=True) - return 'passcode' in result.output - except RunCommandError as e: - if (e.result.returncode == 2 and - 'monkey' in e.result.error): - return False - raise -``` - -Here's how we'd test it with the RunCommandMock partial mock: - -```none -from cros_build_lib_unittest import RunCommandMock, RunCommandError -with RunCommandMock() as pmock: - pmock.AddCmdResult(['./some_command'], returncode=2, error='12 monkeys') - assertEquals(func(), False) - pmock.AddCmdResult(['./some_command'], returncode=1) - assertRaises(RunCommandError, func) - pmock.AddCmdResult(['./some_command'], output='passcode') - assertEquals(func(), True) -``` - -No mucking with setting up mock CommandResults, or mock RunCommandErrors, or -testing for the right redirect_\* or error_code_ok=True arguments. The partial -mock handles all of that for you by using RunCommand logic directly. - -It's also easy to write your own partial mocks that can then be used by other -unit tests. Having a corpus of re-usable mocks will make the barrier to testing -lower, and will help us get into a more test-driven development workflow. - -Thanks for reading, and happy mocking! :)
\ No newline at end of file |