python3 модульное тестирование, исправление возврата метода экземпляра не работает - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь сделать следующее:

@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"

1 Ответ

1 голос
/ 10 марта 2020

В вашем примере вы исправляете функцию uuid4() в модуле uuid, а не функцию uuid4() в модуле, который вы пытаетесь протестировать. Взгляните на Python unnit.test docs, где патчить

Используя приведенный выше пример, вам необходимо патчить uuid4(), импортированный в модуль src. Вам нужно использовать @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"

Надеюсь, это поможет!

...