簡體   English   中英

如何模擬MongoClient進行python單元測試?

[英]How to mock MongoClient for python unit test?

我將以下代碼發送給UT,這使我很麻煩:

  def initialize():
    try :
        self.client = MongoClient("127.0.0.1", 27017)
        self.conn = self.client["DB_NAME"]
    except Exception:
        print "Except in initialize!"
        return False
    return True

我編寫以下測試用例來覆蓋上述功能,希望獲得返回值“ True”:

def mock_mongodb_mongoclient_init(self, para1, para2):
    pass

def mock_mongodb_mongoclient_getitem(self, name):
    return {"DB_NAME":"Something"}

def test_mongodb_initialize_true(self):
    self.patcher1 = patch('pymongo.MongoClient.__init__', new=self.mock_mongodb_mongoclient_init)
    self.patcher2 = patch('pymongo.MongoClient.__getitem__', new=self.mock_mongodb_mongoclient_getitem)
    self.patcher1.start()
    self.patcher2.start()
    self.assertEqual(initialize(), True)
    self.patcher1.stop()
    self.patcher2.stop()

但是,這永遠行不通! 它總是報告“初始化異常!”! 並返回“ False”。

我如何才能使用此MongoClient並使函數返回“ True”?

由於您正在進行單元測試,並且不嘗試以任何方式實際連接到Mongo,因此我認為您應該只關心已調用客戶端API。 所以我建議以下內容-

from unittest import mock
@mock.patch("pymongo.MongoClient")
def test_mongodb_initialize(self, mock_pymongo):
    MyMongo.initialize()
    self.assertTrue(mock_pymongo.called)

(如果我的語法關閉,請原諒我,我使用pytest而不是unittest。)

為了簡單地傳遞initialize(),我們可以模擬pymongo.MongoClient,如下所示:

import unittest
import pymongo
from mock import patch


class MyMongo(object):
    def initialize(self):
        try :
            self.client = pymongo.MongoClient("127.0.0.1", 27017)
            self.conn = self.client["DB_NAME"]
        except Exception:
            print "Except in initialize!"
            return False
        return True


class TestMyMongo(unittest.TestCase):
    def test_mongodb_initialize_true(self):
        with patch('pymongo.MongoClient') as mock_mongo:
            self.mymongo = MyMongo()
            self.assertEqual(self.mymongo.initialize(), True)

但是我不確定您是要模擬MongoClient還是僅模擬MongoClient。 初始化部分?

MongoClient並非旨在以這種方式被嘲笑。 它必須在__init__中初始化其屬性才能起作用,因此,如果您跳過調用__init__ ,則所有其他操作都將引發各種異常。 在您的特定情況下,MongoClient需要訪問__slave_okay屬性,但未設置。

設置一個實際的MongoDB服務器並對其進行測試,或者使用一個偽造的庫模擬所有PyMongo。 僅僅在PyMongo中覆蓋少數方法是不可行的。

暫無
暫無

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

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