Python类mock。我怎样才能获得模拟类方法调用信息

时间:2013-09-09 10:45:02

标签: python unit-testing mocking

我有一个名为 Client 的类,通过其 getResponse 方法提供一些服务。其他类使用此类。 我为使用 Client 类的 Driver 类进行单元测试。 通过使用mock.patch,我用名为 MockClient 的模拟类替换 Client 类 它具有相同的 getResponse 方法,返回一些预定义的值。 它很棒。但现在我想测试参数 getRsponse 方法被调用。 我想通过使用* assert_has_calls *方法来实现。 没找到怎么做。请指教。

待测班级:

# Driver and its Client

class Driver:
    def __init__ (self):
        self.client = Client()

    def call(self, param):
        return self.client.getResponse(param)


class Client:
    def getResponse(self, param):
        return 'original'

这是带有模拟类的Test类:

import unittest
import mock

import driver
from driver import Driver 
from driver import Client


class MockClient:
    def getResponse(self,param):
        return 'mock class' 


class TestIt(unittest.TestCase):

    def setUp(self):
        self.mock_client = mock.patch('driver.Client',create=True, new=MockClient)
        self.mock_client.start()

    def tearDown(self):
        self.mock_client.stop()

    def test_call(self):
        driver = Driver()
        result = driver.call('test')
        self.assertEqual(result, 'mock class')

1 个答案:

答案 0 :(得分:0)

assert_has_calls需要一个可以与之比较的call个对象列表。 您可以通过使用预期的参数和关键字参数调用mock.call辅助函数来获取call对象。

此示例为straight from the documentation,并说明了使用情况:

mock = Mock(return_value=None)
mock(1)
mock(2)
mock(3)
mock(4)
calls = [call(2), call(3)]
mock.assert_has_calls(calls)
calls = [call(4), call(2), call(3)]
mock.assert_has_calls(calls, any_order=True)