今天我們要來介紹 NoSQL 陣營的虛擬資料庫套件 - MongoMock,這個套件可以很好的協助我們在不實際建立 mongo 資料庫的情況下,讓我們進行測試程式的撰寫,並且可以很好的兼容 pymongo 所產生出的 MongoClient
poetry add pymongo
poetry add mongomock
or
pip install pymongo
pip install mongomock
這邊會在 crud.py 檔案內建立一個寫入資料的方式,直接附上範例並進行解說
注意:在正式的專案檔案中 (即非測試程式) 需要使用 pymongo 所提供的 MongoClient,才不會造成不可避免的錯誤
程式解析:
from pymongo.mongo_client import MongoClient
database_name = "test"
collection_name = "user"
def insert_user(conn: MongoClient, data: dict) -> dict:
# 插入資料並取得 id
insert_id = conn[database_name][collection_name].insert_one(data).inserted_id
# 藉由 id 搜尋並回傳
result = conn[database_name][collection_name].find_one({"_id": insert_id})
return result
接著我們要利用 MongoMock 所提供的 MongoClient 來進行 fixture 的撰寫,在開頭有提到,MongoMock 可以很好的兼容 PyMongo,因此我們可以直接使用
MongoMock 的 MongoClient 來進行 CRUD 的測試,範例如下
注意:雖然 MongoMock 可以很好的兼容 PyMongo 不過由於版本問題,某些功能還是會無法使用,因此若測試過程中有跳錯,請留意一下錯誤訊息,
看看是否為 MongoMock 還沒支援相關功能
程式解析:
import pytest
from mongomock.mongo_client import MongoClient
@pytest.fixture(name="conn")
def mongo_client_fixture() -> MongoClient:
with MongoClient() as conn:
yield conn
最後我們要來建立測試程式了,直接附上範例進行解釋
程式解析:
from datetime import datetime
from pymongo.mongo_client import MongoClient
from fixtures import mongo_client_fixture
from crud import insert_user
use_fixtures = [mongo_client_fixture]
def test_insert_user(conn: MongoClient):
# 建立假資料
data = {"username": "nick",
"email": "test@test",
"birthday": datetime(year=2022, month=12, day=31)}
# 測試 CRUD 方法
result = insert_user(data=data, conn=conn)
print(result)
# 驗證內容
assert result["username"] == data["username"]
assert result["email"] == data["email"]
assert result["birthday"] == data["birthday"]