title: How to properly use mock in python with unittest setUp
body: <p>In my attempt to learn TDD, trying to learn unit testing and using mock with python.  Slowly getting the hang of it, but unsure if I'm doing this correctly.  Forewarned: I'm stucking using python 2.4 because the vendor API's come as pre-compiled 2.4 pyc files, so I'm using mock 0.8.0 and unittest ( not unittest2 )</p>
  
  <p>Given this example code in 'mymodule.py'</p>
  
  <pre><code>import ldap
  
  class MyCustomException(Exception):
      pass
  
  class MyClass:
      def __init__(self, server, user, passwd):
          self.ldap = ldap.initialize(server)
          self.user = user
          self.passwd = passwd
  
      def connect(self):
          try:
              self.ldap.simple_bind_s(self.user, self.passwd)
          except ldap.INVALID_CREDENTIALS:
              # do some stuff
              raise MyCustomException
  </code></pre>
  
  <p>Now in my test case file 'test_myclass.py', I want to mock the ldap object out.  ldap.initialize returns the ldap.ldapobject.SimpleLDAPObject, so I figured that'd be the method I'd have to mock out.</p>
  
  <pre><code>import unittest
  from ldap import INVALID_CREDENTIALS
  from mock import patch, MagicMock
  from mymodule import MyClass
  
  class LDAPConnTests(unittest.TestCase):
      @patch('ldap.initialize')
      def setUp(self, mock_obj):
          self.ldapserver = MyClass('myserver','myuser','mypass')
          self.mocked_inst = mock_obj.return_value
  
      def testRaisesMyCustomException(self):
          self.mocked_inst.simple_bind_s = MagicMock()
          # set our side effect to the ldap exception to raise
          self.mocked_inst.simple_bind_s.side_effect = INVALID_CREDENTIALS
          self.assertRaises(mymodule.MyCustomException, self.ldapserver.connect)
  
      def testMyNextTestCase(self):
          # blah blah
  </code></pre>
  
  <p>Leads me to a couple of questions:</p>
  
  <ol>
  <li>Does that look right? :)</li>
  <li>Is that the proper way to try and mock an object that gets instantiated within the class I'm testing?</li>
  <li>Is it ok to be calling the @patch decorator on setUp or is this going to cause weird side effects?</li>
  <li>Is there anyway to get mock to raise the ldap.INVALID_CREDENTIALS exception without having to import the exception into my testcase file?</li>
  <li>Should I be using patch.object() instead and if so, how?</li>
  </ol>
  
  <p>Thanks.</p>