簡體   English   中英

模擬一個Python類的方法並返回一個動態值

[英]Mock the method of a Python class and return a dynamic value

如何使用 Python 的unittest.mock模塊來模擬使用同一類成員的方法?

class NameHelper(object):
    def __init__(self):
        self.local_id = 0

    def next_id(self):
        self.local_id += 1
        return str(self.local_id)

注意,我在setUp方法中使用patch.start 和 patch.stop進行修補:

class TestSomeClient(unittest.TestCase):

    def setUp(self):
        patcher = patch('helpers.name_helper.NameHelper')
        self.addCleanup(patcher.stop)
        self.mock_name_helper = patcher.start()

        # The actual mocked values
        self.mock_name_helper.return_value.local_id = 0
        self.mock_name_helper.return_value.next_id.return_value = 'mock-name'

顯然, mock-name不是一個合理的模擬返回值。 返回值應使用local_id成員NameHelper

我不確定為什么這個問題在沒有評論的情況下被否決了。 答案是,IMO,不清楚。

patch.start 和 patch.stop的 Python 文檔提供了以下用於在 setUp 中打補丁的示例:

class MyTest(TestCase):
     def setUp(self):
         self.patcher1 = patch('package.module.Class1')
         self.MockClass1 = self.patcher1.start()

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

MyTest('test_something').run()

但是,在修補整個類時,這是一種誤導。 以下內容更有幫助:

class MockClass1():
    pass

class MyTest(TestCase):
    def setUp(self):
        self.patcher1 = patch('package.module.Class1')
        self.MockClass1 = self.patcher1.start()
        self.MockClass1.return_value = MockClass1()

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

請注意,附加行:

self.MockClass1.return_value = MockClass1()

return_value應該是類MockClass1的新實例。 應用於我的例子:

class MockNameHelper(object):
    def __init__(self):
        self.local_id = 0

    def next_id(self):
        self.local_id += 1
        return str(self.local_id)

class TestSomeClient(unittest.TestCase):

    def setUp(self):
        patcher = patch('helpers.name_helper.NameHelper')
        self.addCleanup(patcher.stop)
        self.MockNameHelper = patcher.start()
        self.MockNameHelper.return_value = MockNameHelper()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM