Problem When Unit Testing with PMock
steven at lczmsoft.com
steven at lczmsoft.com
Mon Feb 28 19:47:29 EST 2005
Peter,
I'm so sorry, the letter was originally wrote to Terry, not to you!
I guess Terry not very familar to unit testing because he said:
-- cut --
I am not familiar with pmock, but my impression is that mock objects
are
for objects that you may not have available, such as a connection to a
database or file or instance of an umimplemented class ;-). For such
objects, the mock-ness consists in returning canned rather than actual
fetched or calculated answers. Iterators, on the other hand, are
almost as
-- end --
and i just want to say, mocking object is a useful testing method , not
was telling a tutorial. :-)
What you said about the overuse of the generic mock object is very
interesting. I did not think that before. I believe that use generic
or customized mocks is a problem of balance, so we may call it Art :-)
Below is my code, you may look it to understand my original question
(sorry for the coding for i am totally a python newbie):
---------------------------------------
import unittest
from pmock import *
from mainctr import MainCtr
class MainCtrTest(unittest.TestCase):
def testProcess(self):
filePicker = MockFilePicker()
filePicker.expectedNextCalls = len(MockFilePicker.fns) + 1
rpt0 = "foo"
rpt1 = "bar"
(router0, router1) = (Mock(), Mock())
router0.expects(once()).feedIn(eq(MockFilePicker.fns))
router1.expects(once()).feedIn(eq(MockFilePicker.fns))
router0.expects(once()).deliver()
router1.expects(once()).deliver()
router0.expects(once()).getDeliveredSrcList().will(return_value(["fn0",
"fn2"]))
router1.expects(once()).getDeliveredSrcList().will(return_value([]))
router0.expects(once()).getDeliveryRpt().will(return_value(rpt0))
router1.expects(once()).getDeliveryRpt().will(return_value(rpt1))
routes = [router0, router1]
ctr = MainCtr(filePicker, routes)
ctr.process()
self.assertEquals(ctr.getProcessRpt(), [rpt0, rpt1])
filePicker.verify()
router0.verify()
router1.verify()
class MockFilePicker:
fns = ["f0", "f1", "f2"]
idx = 0
nextCalls = 0
resetCalls = 0
expectedResetCalls = 1
expectedNextCalls = 0
processedSet = set()
expectedProcessedSet = set(["fn0", "fn2"])
rememberProcessedCalls = 0
expectedRememberProcessedCalls = 1
def __iter__(self):
return self
def reset(self):
self.resetCalls += 1
def next(self):
self.nextCalls += 1
if self.idx < len(self.fns):
self.idx += 1
return self.fns[self.idx - 1]
else:
raise StopIteration
def processed(self, fn):
self.processedSet.add(fn)
def rememberProcessed(self):
self.rememberProcessedCalls += 1
def verify(self):
if self.nextCalls != self.expectedNextCalls:
raise Exception("nextCalls: " + str(self.nextCalls))
if self.resetCalls != self.expectedResetCalls:
raise Exception("resetCalls: " + str(self.resetCalls))
if self.processedSet != self.expectedProcessedSet:
raise Exception("processedSet: " + str(self.processedSet))
if self.rememberProcessedCalls !=
self.expectedRememberProcessedCalls:
raise Exception("rememberProcessedCalls: " +
str(self.rememberProcessedCalls))
if __name__ == "__main__":
unittest.main()
More information about the Python-list
mailing list