我正在尝试学习如何使用Mocks for Python。但是我一直在努力解决它的一些基本应用。
假设我要测试的代码是:
class ProductionClass:
def method(self):
newone=ProductionClass()
newone.something(1, 2, 3)
def something(self, a, b, c):
pass
def __init__(self):
print("Test")
其中有一个方法只是创建自己的新对象并调用该类的方法。
import unittest
import unittest.mock
from ProductionClass import *
from unittest.mock import *
class TestProduction(unittest.TestCase):
def test_one(self):
real = ProductionClass()
real.something = MagicMock()
real.method()
real.something.assert_called_once_with(1, 2, 3)
if __name__ == '__main__':
unittest.main()
再一次,这是一个非常简单的UnitTest,基本上是从https://docs.python.org/3/library/unittest.mock-examples.html的26.5.1.1复制的。
然而,这将测试是否已调用real.something,同时我真正想要测试的是如果已调用newone.something。
考虑到newone是在我们实际调用method()时创建的 - 方法如何使用mock来测试它?
答案 0 :(得分:0)
您可以通过简单地在setUp方法中实例化ProductionClass并在test_one中修补ProductionClass来测试它,如下所示
import unittest
import ProductionClass
import mock
class TestProduction(unittest.TestCase):
def setUp(self):
self.real = ProductionClass.ProductionClass()
@mock.patch("ProductionClass.ProductionClass")
def test_one(self, mock1):
print "From Test : %s " % mock1()
real = self.real
real.method()
mock1().something.assert_called_once_with(1, 2, 3)
if __name__ == '__main__':
unittest.main()
我刚刚修改了生产类,以显示两个对象都引用了模拟的同一个实例
class ProductionClass:
def method(self):
newone=ProductionClass()
print "From Production class : %s" % newone
newone.something(1, 2, 3)
def something(self, a, b, c):
pass
def __init__(self):
print("Test")
输出:
Testing started at 5:52 PM ...
Test
From Test : <MagicMock name='ProductionClass()' id='4330372048'>
From Production class : <MagicMock name='ProductionClass()' id='4330372048'>
Process finished with exit code 0
您可以通过查看id
来验证两个对象是否引用了模拟对象的相同实例PS:我已经在这个例子中使用了mock包,所以你可能需要使用pip来安装它。