[英]How do you correctly mock a 3rd-party module in Django
我正在嘗試編寫一個簡單的單元測試來測試我在 Django 中的一個模型的實例方法。 但是,我的 class 初始化了__init__
上的外部連接,即使我試圖定位它,它也沒有被修補。
文件夾結構:
- project/
- app1/
- tests/
- tests_models.py
- models.py
模型.py:
from 3rdPartyPlugin import Bot
class MyClass:
def __init__(self, token):
self.bot = Bot(token)
def generate_buttons(self):
...
測試模型.py:
from django.test import TestCase
from unittest.mock import MagicMock, patch
from app1.models import MyClass
@patch('app1.models.3rdPartyPlugin.Bot')
class GenerateButtonsTestCase(TestCase):
def setUp(self):
self.tb = MyClass('', '', '')
def test_generates_button_correctly(self):
return True
我無法通過設置步驟,因為setUp
的初始化失敗,因為即使我修補了它,它也會嘗試訪問該 3rdPartyPlugin 模塊。
我嘗試將補丁設置為:
但是以上所有仍然會導致 Bot 被調用。 有什么建議么?
問題是Bot
在修補之前已經導入並在 models.py 中讀取。 嘗試導入整個模塊:
import 3rdPartyPlugin
class MyClass:
def __init__(self, token):
self.bot = 3rdPartyPlugin.Bot(token)
def generate_buttons(self):
我最終能夠通過將 3rdPartyPlugin 代碼移出初始化程序並進入我正在測試的 class 上的實例方法來解決這個問題。 這是它在代碼中的樣子:
模型.py:
from 3rdPartyPlugin import Bot
class MyClass:
def __init__(self, token):
self.token = token
self.bot = self.bot()
def bot(self):
Bot(self.token)
測試模型.py:
from app1.models import MyClass
class GenerateButtonsTestCase(TestCase):
@patch('app1.models.MyClass.bot')
def setUp(self, _):
self.tb = MyClass('', '', '')
在進行上述更改后,補丁可以正常工作並修補我對 3rdPartyPlugin 中Bot
的使用。 這有點亂,但它對我有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.