模拟对象问题

时间:2013-12-04 16:23:34

标签: unit-testing mocking python-2.6 unittest2

我正在使用来自空间空间的模拟并尝试使用unittest2执行一些测试并且行为很奇怪。当我使用“@ patch.object(Test,'asd')”作为补丁我在函数参数中获取模拟对象。 如果我使用@ patch.object(Test,'asd',new_fun)作为补丁我不会得到其中一个参数。 我正在使用mock-1.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)

1 个答案:

答案 0 :(得分:1)

这是预期的行为。您已将其模拟为类装饰器,并且还指定了新函数new_fun。因此,模拟对象不会传递给测试类中的每个方法。

这意味着您不能指望my_mock作为参数,这也意味着您无法使用my_mock编写断言。

此外,另外,您的模拟方法new_fun与您正在模拟的方法(asd)没有相同的签名。方法asd期望self, a, b="",而new_fun没有参数,因此我希望在调用模拟方法时也会遇到问题。