您的位置:首页 > 编程语言 > Python开发

python mox使用方法

2014-01-03 18:00 302 查看
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


要测试函数get_most_popular_animal,需要先处理函数get_month,确保每次返回固定的数值。这里可以使用mox中的函数 StubOutWithMock.

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()


StubOutWithMock 用来指明哪个模块中的哪个函数需要被mock,后面通过AndReturn就可以指定函数的行为了。在调用被测函数之前,运行ReplayAll函数来生效这些mock。

对于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()函数来检测哪些函数应该被执行到。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: