pymox是一套用于python代码unit test的框架. 官方链接如下:
https://code.google.com/p/pymox/
但是从官方的wiki上看到pymox的使用案例较少,而且比较简略.
这里按照通常使用情况整理下.
首先从最基本的框架说起.
创建一个unit test的test case, 在这里需要先import两个包
import mox
import unittest
class TestZoo(unittest.TestCase):
def setUp(self):
self.m = mox.Mox()
def tearDown(self):
self.m.UnsetStubs()
现在设定被测程序存放于zoo.py, 提供函数如下:
from datetime import date
def get_most_popular_animal():
month = get_month()
if month in [11,12,1]:
return 'penguin'
elif month in [6,7,8]:
return 'swan'
else:
return 'tiger'
def get_month():
today = date.today()
return today.month
def get_day():
today = date.today()
return today.day
def test_get_most_popular_animal(self):
self.m.StubOutWithMock(zoo, 'get_month')
zoo.get_month().AndReturn(1)
self.m.ReplayAll()
self.assertEqual('penguin', zoo.get_most_popular_animal())
self.m.VerifyAll()
对于VerifyAll函数,其实在这里即使去掉这句话测试case也是可以通过的。
如果我们对case稍加修改:
def test_get_most_popular_animal(self):
self.m.StubOutWithMock(zoo, 'get_month')
zoo.get_month().AndReturn(1)
self.m.StubOutWithMock(zoo, 'get_day')
zoo.get_day().AndReturn(2)
self.m.ReplayAll()
self.assertEqual('penguin', zoo.get_most_popular_animal())
self.m.VerifyAll()
mock一个新的函数get_day,get_most_popular_animal其实并未调用此函数,于是运行时会得到下面的错误:
ExpectedMethodCallsError: Verify: Expected methods never called:
0. get_day.__call__() -> 2
所以可以通过VerifyAll()函数来检测哪些函数应该被执行到。