最近在Python内使用单元测试时,发现了大概三种实现.在这里记录一下,以待后续使用
mock官网地址
1. [mox]使用StubOutWithMock
1 | from mox3 import mox |
该方法使用self.mox.StubOutWithMock
将compute_api.API
内的create_xen_pool
进行mock,后续使用
1 | compute_api.API.create_xen_pool(mox.IgnoreArg(), mox.IgnoreArg())\ |
mock了该方法的返回值.
并使用了
1 | self.mox.ReplayAll() |
将所有的mock生效.
注意:
1 | compute_api.API.create_xen_pool(mox.IgnoreArg(), mox.IgnoreArg())\ |
以上代码的create_xen_pool
方法内的参数个数与实际的参数个数一致.
该种方法存在问题:若想测试的方法内,同时调用了多次同一个方法.则无法使用该方式.self.mox.StubOutWithMock(compute_api.API, 'create_xen_pool')
mock出来的方法,只能被一次有效调用.
2. [stub]使用stubs
1 | def test_disable_host(self): |
如你所见,我们想要对objects.XenHost
的get_host_by_filter
进行mock,仅需要一句
1 | self.stubs.Set(objects.XenHost, 'get_host_by_filter', |
就可以了.不过这里的self.fill_mock_host_enabled
对应的是mock方法的返回值.
注意:
在self.fill_mock_host_enabled
方法内的入参个数,要与实际要mock的get_host_by_filter
方法要求的参数个数一样.
3. [mock]使用mock
该方法是我主要推荐的方法,最主要是因为写着简单,直接上示例
1 | import mock |
如上,看着上面的代码有没有感觉很清新啊,基本内部没有什么其他的操作.唯一干的事情就是写上具体mock方法的返回值.
不过,需要注意的是.该方法使用的是装饰器,所以要求mock.patch的顺序与方法内的入参顺序是相反的.其他的就没什么了.你就可以愉快的玩耍了.
额外福利
1 | import a |
这里给上使用mock的解决办法
1 | class TestDemo(test.TestCase): |