簡體   English   中英

來自unittest.mock.patch的意外行為

[英]Unexpected behavior from unittest.mock.patch

我下面的代碼有什么問題?

我期望assert call_func_once_with("b")會在call_func被傳遞'a'時引發錯誤。 我確信該函數確實被調用過一次並帶有參數“ a”。

from unittest.mock import Mock, patch
def call_func(x):
    pass

@patch("__main__.call_func")
def test_call_func(call_func):
    call_func("a")
    assert call_func.called_once_with("b")
    assert call_func.called == 1
    print(call_func.call_args)

test_call_func()

輸出:

call('a')

您不是第一個注意到這類斷言的奇怪事物的人(請參閱魔術嘲笑assert_call_once與assert_Called_once_with奇怪的行為

對於它的價值,我只能建議您嘗試創建一個從unittest.TestCase繼承的測試類,然后使用assertEqual方法獲取更一致的測試行為:

import unittest
from unittest.mock import patch, call


def call_func(x):
    pass


class MyTests(unittest.TestCase):
    @patch("__main__.call_func")
    def test_call_func(self, call_func_mock):
        call_func_mock("a")
        # assert call_func_mock.called == 1
        # assert call_func_mock.called_once_with("b")
        self.assertEqual(call_func_mock.call_count, 1)
        self.assertEqual(call_func_mock.call_args_list[0], call("b"))
        print(call_func_mock.call_args)


unittest.main()

這給出了以下(預期)結果:

F
======================================================================
FAIL: test_call_func (__main__.MyTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python36\lib\unittest\mock.py", line 1179, in patched
    return func(*args, **keywargs)
  File "C:/scratch.py", line 16, in test_call_func
    self.assertEquals(call_func_mock.call_args_list[0], call("b"))
AssertionError: call('a') != call('b')

----------------------------------------------------------------------
Ran 1 test in 0.003s

FAILED (failures=1)

Process finished with exit code 1

暫無
暫無

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

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