簡體   English   中英

如何在測試中為多個函數重用相同的模擬

[英]How do I reuse same mocks for multiple functions in testing

我有一個測試文件,我在其中為每個函數重用相同的模擬。

@mock.patch.object(...)
def xyz(mock_xyz):
    mock_xyz.side_effect = lambda x, y: None
    ....

@mock.patch.object(...)
def abc(mock_xyz):
    mock_xyz.side_effect = lambda x, y: None
    ....

@mock.patch.object(...)
def lmn(mock_xyz):
    mock_xyz.side_effect = lambda x, y: None
    ....
.
.
.

如何避免每次都定義模擬? PS:我在示例中只使用了一個模擬,但我在 6 個測試方法中使用了相同的四個模擬。

您可以在setUp()定義它並使其成為您的TestCase類的成員:

class MyTest(unittest.TestCase):
    def setUp(self):
        self.mock_xyz = mock.patch.object(...)
        self.mock_xyz.side_effect = lambda x, y: None

    def xyz(self):
        with self.mock_xyz:
            # Do test stuff
        ....

我有同樣的問題,並不喜歡每個模擬對象使用一個上下文管理器的外觀,因為 6+ 嵌套語句變得有點愚蠢。 此外,無法在 python 2.7 上運行(即使使用 unittest2),所以不確定它是否是 python 3 的專有功能。

無論如何,我想我會把我的解決方案留在這里,以防其他人像我一樣來解決這個問題。 我最終得到了這樣的結果:

import unittest2
from mock import patch

@patch('package.module.something')
@patch('package.module.SomeClass.something_else')
class TestBase(unittest2.TestCase):

    def setup_mocks(self, mock_object):
        mock_name = mock_object._mock_name
        if mock_name == 'something':
            # do something stuff
            mock_object.side_effect = lambda: 'something'
        elif mock_name == 'something_else':
            # do something else
            mock_object.side_effect = lambda: 'something else

    def test_stuff(self, *mocks):
        for m in mocks:
            self.setup_mocks(m)

        # do test stuff

現在我可以根據需要添加任意數量的模擬,並且每次測試都會對它們進行修補。 如果在不同的模塊中有兩件相同的事情可能會遇到問題,但它還沒有發生,所以當我遇到它時我會越過那座橋;)

暫無
暫無

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

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