使用Python的UnitTest Mock作为新对象

时间:2015-05-26 11:08:48

标签: python unit-testing mocking

我正在尝试学习如何使用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来测试它?

1 个答案:

答案 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来安装它。