我正在使用voidspace中的mock,并试图使用unittest2执行一些测试,但行为很奇怪。当我使用"@patch.object(Test,'asd')"作为补丁时,我会在函数参数中获得mock对象。如果我使用@patch.object(Test,'asd',new_fun)作为补丁,我不会得到其中一个参数。我正在使用mock-0.1
在这里,您可以看到一个小的代码示例来说明这个问题。我想试着了解这个问题是我做补丁的方式有问题,还是库中有问题。
import unittest2 as unittest
from mock import patch
class Test:
def asd(self, a, b =""):
print "1"
class Test1:
def kk(self, l):
Test().asd("1")
def kk1(self, l):
Test().asd("1","1")
@patch.object(Test,'asd')
class MockClassUT(unittest.TestCase):
def test_stat_process(self, my_mock):
t = Test1()
def test_stat_process1(self, my_mock):
t = Test1()
def test_stat_process2(self, my_mock):
t = Test1()
def new_fun(*args, **kwargs):
print "1"
@patch.object(Test,'asd',new_fun)
class MockClassUT1(unittest.TestCase):
def test_stat_process(self, my_mock):
t = Test1()
t.kk("1")
my_mock.assert_called_with("k")
testloader = unittest.TestLoader()
testnames = testloader.getTestCaseNames(MockClassUT)
suite = unittest.TestSuite()
for name in testnames:
suite.addTest(MockClassUT(name))
testnames = testloader.getTestCaseNames(MockClassUT1)
for name in testnames:
suite.addTest(MockClassUT1(name))
print testnames
unittest.TextTestRunner(verbosity=2).run(suite)
这是预期行为。您已经将其模拟为类装饰器,还指定了新函数new_fun
。因此,模拟对象不会传递给测试类中的每个方法。
这意味着您不能期望my_mock
作为参数,也意味着您不能使用my_mock
编写断言。
此外,顺便说一句,您的模拟方法new_fun
与您正在模拟的方法(asd
)没有相同的签名。方法asd
需要self, a, b=""
,而new_fun
没有参数,所以我希望在调用模拟方法时也会出现问题。