[英]How to use map for class method within another class method in Python
[英]How to test if another class method is called within a method in python?
我有以下結構:
ClassB():
def foo():
Class A():
def __init__(self, B):
#some initialisations
def method1():
#complex logic
B.foo()
我正在嘗試編寫一個單元測試方法 1 並想測試 foo 是否被調用一次。 我怎樣才能做到這一點? 我應該嘲笑什么?
根據OP提供的進一步信息,對答案進行了返工。
以下代碼已在 CentOS 上使用 Python3.8.3 本地測試過。運行python3 -m unittest
查看測試結果。
功能代碼(sub.py):
class B():
def foo(self):
pass
class A():
def __init__(self, B):
self.b = B
def method1(self):
self.b.foo()
測試代碼(test.py):
from unittest import TestCase
from unittest.mock import patch
from sub import A, B
class Test(TestCase):
def test_A(self):
with patch('sub.B.foo') as mock_foo:
a = A(B)
a.method1()
mock_foo.assert_called_once()
基本上,測試代碼會嘗試模擬B.foo
方法,並在調用A.method1
時檢查該方法是否已完全調用一次。
a = A(B)
行不調用B.foo
a.method1()
行調用B.foo
總的來說, B.foo
被調用一次,所以mock_foo.assert_called_once()
將通過。 如果上面的 arguments 中的任何一個結果無效,則斷言將失敗。 如果您只需要檢查B.foo
是否至少被調用過一次,請改用mock_foo.assert_called()
。
關於 mock 系統的詳細信息,我建議閱讀官方文檔。
您應該為B
創建一個 Mock ,將其傳遞給A
的構造函數並檢查 function 是否被調用過一次。
您可以自己編寫 Mock。 例如:
class B_Mock():
def __init__(self):
self.foo_calls = 0
def foo(self):
self.foo_calls += 1
然后用assert
檢查 B_Mock 實例的 attr foo_calls
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.