簡體   English   中英

如何測試在 python 的方法中是否調用了另一個 class 方法?

[英]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時檢查該方法是否已完全調用一次。

測試說明

  1. a = A(B)行不調用B.foo
  2. a.method1 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.

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