模拟对象问题



我正在使用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没有参数,所以我希望在调用模拟方法时也会出现问题。

相关内容

最新更新