簡體   English   中英

如何使用unittest.mock在單元測試中模擬任意ConfigParser調用

[英]How to use unittest.mock to mock arbitrary ConfigParser calls in a unit test

我正在嘗試使用unittest.mock的action / assert模式而不是mox的record / replay / verify模式。

# foo.py
def op_1(param):
    pass

def op_2(param):
    pass

def do_stuff(param_1, param_2):
    global config
    global log
    try:
        op_1(param_1)
        if config.getboolean('section','option'):
            op_2(param_2)
    except:
         log.error("an error occured")

而且,這是我的unittest文件的示例。

# test_foo.py
class TestFoo(unittest.TestCase):
    def test_do_stuff(self):
        param_1 = None
        param_2 = None
        foo.config = MagicMock()
        foo.config.getboolean('section','option', return_value = True)
        foo.op_1 = MagicMock()
        foo.op_2 = MagicMock()
        do_stuff(param_1, param_2)
        foo.op_1.assert_called_once_with(param_1)
        foo.op_2.assert_called_once_with(param_2)
        foo.config.getboolean.assert_called_once_with('section','option')

這個測試驗證下面的項目/我使用模擬權利嗎?

  1. do_stuff調用返回沒有錯誤
  2. 使用param_1調用op_1
  3. 使用param_2調用op_2
  4. 配置解析器對象已被使用,但具體的調用無關緊要

事實證明我使用了return_value錯誤。

當我需要一個mock.Mockmock.MagicMock對象來返回一個值時,無論傳遞什么參數,它都需要始終返回該值。 但是,基於傳遞的參數( 可能的特征請求 )給出不同的行為可能會很好。

我完成這個的方式是:

foo.config.getboolean = mock.MagicMock(return_value = True)

然后我可以這樣做:

self.assertGreaterThan(len(foo.config.mock_calls), 0)
self.assertGreaterThan(len(foo.config.getboolean(str(),str())), 0)

暫無
暫無

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

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