簡體   English   中英

如何在另一個 class 中創建模擬 class 的實例

[英]How to create an instance of mocked class within another class

Class A 具有另一個 class B 的屬性。

Class A():
   def __init__(self, b):
      self.b = b

   def get_b_secret(self, job_id):
      x, y = self.b.get_secret(job_id)
      return x, y

Class B():
   def __init__(self, key, url):
      self.key = key
      self.url = url
   def get_secret(job_id):
      # logic to get secret
      # return a tuple
      return x, y

我想通過 mocking B class 為 class A 的方法get_b_secret編寫一個單元測試作為一個整體。

@patch('b.B')
def test_get_b_secret(self, mock_b):
    mock_b.b.get_secret.return_value = ('x', 'y')
    obj = A(mock_b) 
    expected = ('x','y')
    self.assertEqual(obj.get_b_secret('001'), expected)

我意識到通過 mocking class B,我並沒有真正將 B 實例化到 A 實例內部的實例。 這就是為什么當我調試測試時, Aget_b_secret返回一個MagicMock object 。

我發現 這篇關於 mocking object 的文章。 但在該示例中,外部類的 init 沒有內部 Class object 作為參數。 所以有點不同。 最好的方法是什么?

如果您的示例代碼是正確的,那么您不需要模擬 class B。您只需在初始化時將帶有 function get_secret 的模擬傳遞到 class A 中。

mock = MagicMock()    

mock.return_value.get_secret.return_value = ('x', 'y')
obj = A(mock)
....

暫無
暫無

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

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