<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&#39;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 = &#39;ping %s&#39; % (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(&#39;Error code was: %d&#39; % (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&#39;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&#39;t work and I suspect it&#39;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([&#39;ping&#39;,&#39;localhost&#39;])</font></div>


<div><font face="courier new, monospace">        pinger.ping_host(&#39;127.0.0.1&#39;)</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__ == &#39;__main__&#39;:</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>