<div dir="ltr"><div class="gmail_quote">Originally sent to python tutor mailing list but I suspect this might be a better list for my question...<br><br><div dir="ltr"><div>Hi all<br></div><div dir="ltr"><div><br></div><div>
I have a question regarding mocking in unit testing.</div><div><br></div><div>Let's assume I have the following class:</div><div><br></div><div><font face="courier new, monospace">-------------------------------------------</font></div>
<div><font face="courier new, monospace">import subprocess<br></font></div><div><font face="courier new, monospace"><br></font></div><div><div><font face="courier new, monospace">class Pinger(object):</font></div><div><font face="courier new, monospace"><br>
</font></div><div><font face="courier new, monospace"> def ping_host(self, host_to_ping):</font></div><div><font face="courier new, monospace"> cmd_string = 'ping %s' % (host_to_ping)</font></div><div><font face="courier new, monospace"> cmd_args = cmd_string.split()</font></div>
<div><font face="courier new, monospace"> proc = subprocess.Popen(cmd_args, shell=True)</font></div><div><font face="courier new, monospace"> proc.wait()</font></div><div><font face="courier new, monospace"> if proc.returncode != 1:</font></div>
<div><font face="courier new, monospace"> raise Exception('Error code was: %d' % (proc.returncode))</font></div></div><div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">-------------------------------------------</font></div>
<div><br></div><div><br></div><div>In my unittest I don't want to run the ping command, (It might not be available on the build system) I merely want to check that a call to subprocess.Popen is made and that the parameters are what I expect?</div>
<div><br></div><div>So far I have this, but it doesn't work and I suspect it's way off!!</div><div><br></div><div><br></div><div><font face="courier new, monospace">-------------------------------------------<br>
</font></div>
<div><div><font face="courier new, monospace">import mock</font></div><div><font face="courier new, monospace">import unittest</font></div><div><font face="courier new, monospace">from tutor_q import Pinger</font></div><div>
<font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">class Test_Pinger(unittest.TestCase):</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace"> def test_ping_host(self):</font></div>
<div><font face="courier new, monospace"> pinger = Pinger()</font></div><div><font face="courier new, monospace"> assert pinger</font></div><div><font face="courier new, monospace"> subprocess = mock.Mock()</font></div>
<div><font face="courier new, monospace"> subprocess.Popen.return_value = 0</font></div><div><font face="courier new, monospace"> subprocess.assert_called_once_with(['ping','localhost'])</font></div>
<div><font face="courier new, monospace"> pinger.ping_host('127.0.0.1')</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace"><br></font></div><div>
<font face="courier new, monospace"><br>
</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">if __name__ == '__main__':</font></div><div><font face="courier new, monospace"> unittest.main()</font></div>
</div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">-------------------------------------------</font><br></div><div><br></div><div><br></div><div>Can anyone point me in the right direction on how to mock up these subprocess calls?</div>
<div><br></div><div>Thanks</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>James</div><div><br></div><div><br></div><div><br></div><div></div></font></span></div></div></div>
</div><br></div>