I want to test if a mocked method is called by multiprocessing.Process
. I am aware that a subprocess call makes a fork of the current process and that the information can only be available in the subprocess. However, I would like to know if there is a clean way to test such a usecase anyway.
One possibility would certainly be to simply not use a mock but, for example, to call a function that simply writes a file somewhere and use it to verify that the method has run through successfully. However, a “clean” solution with mocking would definitely be preferable to me.
Minimal example:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import multiprocessing from unittest.mock import MagicMock # Create mock method mocked_target: MagicMock = MagicMock() # Make sure that the call counter works assert 0 == mocked_target.call_count mocked_target() assert 1 == mocked_target.call_count # Call the method via multiprocessing process: multiprocessing.Process = multiprocessing.Process(target=mocked_target) process.start() process.join() assert 2 == mocked_target.call_count # Does not work, call counter is still 1
Possible related question:
- Mocking method in class called through Multiprocessing.Process
- How should I unit test multithreaded code?
Edit:
This package actually provides this functionality. Unfortunately, it is neither available on pypi nor actively maintained.
Advertisement
Answer
As mentioned, https://github.com/elritsch/python-sharedmock does the job pretty well.