python3 实例方法的单元测试、修补 return 不起作用
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
是被测 class 的夹具。
但是,在我的 app_api
class 中,uuid4()
没有得到修补并且不断返回一个 uuid 而不是我试图强制执行的 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'
我已经咨询过这个post:How to mock uuid generation in a test case?但还是没有运气。
我做错了什么?感谢所有提前回复的人。
编辑:这是完整的代码:
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 where to patch
使用上面的示例,您需要修补导入到 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"
希望对您有所帮助!
我正在尝试执行以下操作:
@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
是被测 class 的夹具。
但是,在我的 app_api
class 中,uuid4()
没有得到修补并且不断返回一个 uuid 而不是我试图强制执行的 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'
我已经咨询过这个post:How to mock uuid generation in a test case?但还是没有运气。
我做错了什么?感谢所有提前回复的人。
编辑:这是完整的代码:
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 where to patch
使用上面的示例,您需要修补导入到 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"
希望对您有所帮助!