Say you have the following class:
import urllib2 class UrlDownloader(object): def download(self, url): """ Read the content from the url. The content is returned as a string object. """ return urllib2.urlopen(url).read()You actually don't want to download something from the net when you do a unit test for this class. You would like to have a fixed string returned from the read() method. This can be hard to achieve in some languages (for example Java) but that's not true for Python. Python supports redefining class methods, functions and other things in run-time. The following snippet shows how easy it's to mock the urlopen() function in the urllib2 module to return a mocked file-like object:
import urllib2 import unittest class MockFileObject(object): def read(self): return "DATA" def mock_open(url): return MockFileObject() class UrlDownloaderTest(unittest.TestCase): def testDownload(self): urllib2.urlopen = mock_open dl = UrlDownloader() self.assertEqual(dl.download(""), "DATA") if __name__ == '__main__': unittest.main()In this unit test we redefine the urlopen-function (remember, this is not a member of an instance, it's a plain function) with our own which returns a mock file-like object. It's not that hard to imagen all the possibilities this gives when writing tests. There are of course frameworks that will help you with creating mocks etc, you could try The Python Mock Module which should cover most of the use cases.
No comments:
Post a Comment