#!/usr/bin/python
__author__ = "raphtee@google.com (Travis Miller)"
import mock, mock_demo_MUT
class MyError(Exception):
pass
class A(object):
var = 8
def __init__(self):
self.x = 0
def method1(self):
self.x += 1
return self.x
def method2(self, y):
return y * self.x
class B(A):
def method3(self, z):
return self.x + z
def method4(self, z, w):
return self.x * z + w
class C(B):
def method5(self):
self.method1()
t = self.method2(4)
u = self.method3(t)
return u
class D(C):
def method6(self, error):
if error:
raise MyError("woops")
else:
return 10
class E(D):
def __init__(self, val):
self.val = val
# say we want to test that do_stuff is doing what we think it is doing
def do_stuff(a, b, func):
print b.method1()
print b.method3(10)
print func("how many")
print a.method2(5)
print b.method1()
print b.method4(1, 4)
print b.method2(3)
print b.method2("hello")
def do_more_stuff(d):
print d.method6(False)
try:
d.method6(True)
except:
print "caught error"
def main():
god = mock.mock_god()
m1 = god.create_mock_class(A, "A")
print m1.var
m2 = god.create_mock_class(B, "B")
f = god.create_mock_function("func")
print dir(m1)
print dir(m2)
# sets up the "recording"
m2.method1.expect_call().and_return(1)
m2.method3.expect_call(10).and_return(10)
f.expect_call("how many").and_return(42)
m1.method2.expect_call(5).and_return(0)
m2.method1.expect_call().and_return(2)
m2.method4.expect_call(1, 4).and_return(6)
m2.method2.expect_call(3).and_return(6)
m2.method2.expect_call(mock.is_string_comparator()).and_return("foo")
# check the recording order
for func_call in god.recording:
print func_call
# once we start making calls into the methods we are in
# playback mode
do_stuff(m1, m2, f)
# we can now check that playback succeeded
god.check_playback()
# now test the ability to mock out all methods of an object
# except those under test
c = C()
god.mock_up(c, "c")
# setup recording
c.method1.expect_call()
c.method2.expect_call(4).and_return(4)
c.method3.expect_call(4).and_return(5)
# perform the test
answer = c.method5.run_original_function()
# check playback
print "answer = %s" % (answer)
god.check_playback()
# check exception returns too
m3 = god.create_mock_class(D, "D")
m3.method6.expect_call(False).and_return(10)
m3.method6.expect_call(True).and_raises(MyError("woops"))
do_more_stuff(m3)
god.check_playback()
# now check we can mock out a whole class (rather than just an instance)
mockE = god.create_mock_class_obj(E, "E")
oldE = mock_demo_MUT.E
mock_demo_MUT.E = mockE
m4 = mockE.expect_new(val=7)
m4.method1.expect_call().and_return(1)
mock_demo_MUT.do_create_stuff()
god.check_playback()
mock_demo_MUT.E = oldE
if __name__ == "__main__":
main()