簡體   English   中英

您如何正確模擬 Django 中的第 3 方模塊

[英]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 模塊。

我嘗試將補丁設置為:

  • @patch('app1.models.3rdPartyPlugin.Bot')
  • @patch('app1.models.Bot')
  • @patch('app1.models.TB.Bot')

但是以上所有仍然會導致 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.

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