簡體   English   中英

python3單元測試,修補實例方法的返回不起作用

[英]python3 unit testing, patching return of instance method not working

我正在嘗試執行以下操作:

@patch('uuid.uuid4', autospec=True)
def test_generate_adid(self, patched_uuid, app_api):
    patched_uuid.return_value = "9e51ab81-6d65-4b81-af3b-8f7f49d69ba7"
    adid = app_api.generate_adid()
    assert adid == "9e51ab81-6d65-4b81-af3b-8f7f49d69ba7"

其中app_api是被測類的夾具。

但是,在我的app_api類中, uuid4()沒有得到修補,並且不斷返回一個 uuid,而不是我試圖強制的那個。 這是generate_adid()實例方法的樣子:

from uuid import uuid4    
def generate_adid(self):
        adid = str(uuid4())
        return adid

失敗的單元測試錯誤:

AssertionError: assert '90b29e86-e3b0-40aa-8971-f868f90cb009' == '9e51ab81-6d65-4b81-af3b-8f7f49d69ba7'

我已經查閱了這篇文章: 如何在測試用例中模擬 uuid 生成? 但仍然沒有運氣。

我究竟做錯了什么? 感謝所有提前回復的人。

編輯:這是完整的代碼:

from requests import Session
from random import uniform
from hashlib import md5
from hmac import new
from uuid import uuid4
from json import dumps

class AppApi:

    def __init__(self, account):
        self.account = account
        self.session = Session()

    def generate_adid(self):
        adid = str(uuid4())
        return adid

測試用例:

from src import AppApi
from pytest import fixture
from unittest.mock import patch
from json import loads


ACCOUNT = {
    "email": "user@email.com",
    "username": "user",
    "password": "s3cr3t"
}

@fixture
def app_api():
    app_api = AppApi(ACCOUNT)
    yield app_api

class TestAppApi:

    @patch('uuid.uuid4')
    def test_generate_adid(self, patched_uuid, app_api):
        patched_uuid.return_value = "9e51ab81-6d65-4b81-af3b-8f7f49d69ba7"
        adid = app_api.generate_adid()
        assert adid == "9e51ab81-6d65-4b81-af3b-8f7f49d69ba7"

在您的示例中,您正在修補uuid模塊中的uuid4()函數,而不是您嘗試測試的模塊中的uuid4()函數。 看一下Python unnit.test docs 在哪里打補丁

使用上面的示例,您需要修補導入到src模塊中的uuid4() 你需要使用@patch("src.uuid4")

from src import AppApi
from pytest import fixture
from unittest.mock import patch
from json import loads


ACCOUNT = {
    "email": "user@email.com",
    "username": "user",
    "password": "s3cr3t"
}

@fixture
def app_api():
    app_api = AppApi(ACCOUNT)
    yield app_api

class TestAppApi:

    @patch('src.uuid4')
    def test_generate_adid(self, patched_uuid, app_api):
        patched_uuid.return_value = "9e51ab81-6d65-4b81-af3b-8f7f49d69ba7"
        adid = app_api.generate_adid()
        assert adid == "9e51ab81-6d65-4b81-af3b-8f7f49d69ba7"

希望這可以幫助!

暫無
暫無

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

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