簡體   English   中英

我們如何確保 Mock.call_args_list 中的調用包含在調用 Mock 對象時具有相同狀態的參數的調用?

[英]How do we ensure that the calls in the Mock.call_args_list contain calls with arguments at the same state of when the Mock object was called?

from mock import Mock
j = []
u = Mock()
u(j)
# At this point u.call_args_list == [call([])]
print u.call_args_list
j.append(100)
# At this point u.call_args_list == [call([100])], but I expect it to be [call([])], since it was never called when j had a value of 100 in it
print u.call_args_list

我的問題是如何確保u.call_args_list中的調用包含調用模擬時而不是檢查模擬參數時所有對象的狀態?

我目前正在使用mock==1.0.1

這在文檔部分26.6.3.7 中討論 處理可變參數

不幸的是,他們真的沒有任何優雅的解決方案來解決這個問題! 推薦的解決方法是使用side_effect從可變參數中復制元素。

如果您為模擬提供 side_effect 函數,則將使用與模擬相同的參數調用 side_effect。 這使我們有機會復制參數並將它們存儲以供以后的斷言使用。

在我看來,實施起來有些混亂。 如果您需要在多個地方使用該功能,您可能更喜歡將Mock子類化並直接添加該功能:

from copy import deepcopy

class CopyingMock(MagicMock):
    def __call__(self, *args, **kwargs):
        args = deepcopy(args)
        kwargs = deepcopy(kwargs)
        return super(CopyingMock, self).__call__(*args, **kwargs)

2017 年:現在可以在第三方發行版中使用( pip install copyingmock )。

>>> from copyingmock import CopyingMock
>>> mock = CopyingMock()
>>> list_ = [1,2]
>>> mock(list_)
<CopyingMock name='mock()' id='4366094008'>
>>> list_.append(3)
>>> mock.assert_called_once_with([1,2])
>>> mock.assert_called_once_with(list_)

AssertionError: Expected call: mock([1, 2, 3])
Actual call: mock([1, 2])

暫無
暫無

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

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