簡體   English   中英

Python 模擬:如何模擬從正在測試的 class 方法調用的 class

[英]Python mock: How to mock a class being called from the class method being tested

假設我有以下代碼:

bm.py    

from a.b import AC
class B:
    def __init__(self, **kwargs):
         self.blah = kwargs["blah"]
    def foo(self, message):
         # Do something here and then finally use AC().send()
         AC().send(message)

我正在為上述內容編寫以下測試用例:

import pytest
import unittest
from mock import patch
from a.b import AC
import B

class TestB(unittest.TestCase):
    @patch('AC.send')
    def test_foo(self, mock_send):
         s = B(blah="base")
         s.foo("Hi!")
         ## What to assert here???

我想模擬AC.send AC.send不返回任何內容,因為它正在“發送”到某些外部服務/機器。 而且, B.foo() 也不返回任何東西。 所以我不確定我應該斷言和檢查什么?

使用上面的測試用例,我得到以下錯誤:

ModuleNotFoundError: No module named 'AC'

我是單元測試用例和 mocking 的新手。

關於

ModuleNotFoundError: No module named 'AC'

您應該在 @patch 中使用完整的 quilifired 名稱 - 在您的情況下為 @patch('abAC.send')

關於

## What to assert here??? 

這個問題太寬泛了,而且依賴於應用程序。 通常,您需要問自己對生產代碼的期望是什么。 有時您只想檢查是否有異常。 在這種情況下,您不需要斷言任何內容。 如果出現異常,測試將失敗。

建議閱讀這篇精彩的帖子

您可以使用完全導入。

@patch('a.b.AC.send')

根據@Florian Bernard 在評論部分提到的內容,以下內容有效!

import pytest
import unittest
from mock import patch
from a.b import AC
import B

class TestB(unittest.TestCase):
     @patch('a.b.AC.send') ##Provide the full import
     def test_foo(self, mock_send):
         s = B(blah="base")
         s.foo("Hi!")

暫無
暫無

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

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