* Helge Stenstroem wrote: > Say I have a function > > def f(filename): > result = openFileAndProcessContents(filename) > return result > > Can that function be unit tested without having a real file as input? > Something along the lines of > > import unittest > class tests(unittest.TestCase): > def test1(self): > fileContents = "bla bla bla\nmore bla bla bla" > ??? # make f read this string instead of opening a file > expected = expectedResult > result = f(filename) > self.assertEqual(result, expected) > > One possibility would be to make the unit test write to a temporary > file. Are there better alternatives?
You can also just replace or shadow the file/open builtin (that's what I'm doing). Something like: def test1(self): import StringIO fileContents = "bla bla bla\nmore bla bla bla" def myfile(name, mode, buffering): return StringIO.StringIO(fileContents) testedmodule.file = myfile try: expected = expectedResult result = f(filename) finally: del testedmodule.file self.assertEqual(result, expected) (if you're using open, replace .file with .open) (testedmodule is of course the module where the file call happens) nd -- die (eval q-qq[Just Another Perl Hacker ] ;-) # André Malo, <http://www.perlig.de/> # -- http://mail.python.org/mailman/listinfo/python-list