py.test -- 模拟常量并在测试函数中引发异常
py.test -- mock a constant and raise an exception in test function
我正在使用 py.test 和模拟。我一直无法模拟一个常量。我的测试修改了分配给常量的字典值。这应该在我的测试中引发异常,但到目前为止它没有。我不确定问题出在哪里,如果能帮助查明问题,我将不胜感激。谢谢。
the_module.py
MY_DICT = {'one': 1, 'two': 2, 'three': 3}
class OneMissingException(Exception):
pass
class Test1(object):
def __init__(self):
self.mydict = MY_DICT
@property
def mydict(self):
return self._mydict
@mydict.setter
def mydict(self, mydict):
if 'one' not in mydict:
raise OneMissingException
self._mydict = mydict
test_themodule.py
import pytest
from unittest import mock
from the_module import Test1, OneMissingException
@pytest.fixture(scope='function')
def my_dict():
return {'one': 1, 'two': 2, 'three': 3}
def test_verify_test1_exception(my_dict):
my_dict.pop('one') # comment this out and test still passes
with mock.patch("the_module.MY_DICT") as mydict:
mydict.return_value.return_value = my_dict
with pytest.raises(OneMissingException):
Test1()
在你的情况下你不需要模拟(你试图以错误的方式使用它,因为没有人调用 MY_DICT 而你尝试了 return_value)
仅使用 pytest 的 monkeypatch fixture:
import pytest
from unittest import mock
from the_module import Test1, OneMissingException
@pytest.fixture
def patched_my_dict(monkeypatch):
patched = {'one': 1, 'two': 2, 'three': 3}
monkeypatch.setattr("the_module.MY_DICT", patched)
return patched
def test_verify_test1_exception(patched_my_dict):
patched_my_dict.pop('one') # comment this out and test will not pass
with pytest.raises(OneMissingException):
Test1()
我正在使用 py.test 和模拟。我一直无法模拟一个常量。我的测试修改了分配给常量的字典值。这应该在我的测试中引发异常,但到目前为止它没有。我不确定问题出在哪里,如果能帮助查明问题,我将不胜感激。谢谢。
the_module.py
MY_DICT = {'one': 1, 'two': 2, 'three': 3}
class OneMissingException(Exception):
pass
class Test1(object):
def __init__(self):
self.mydict = MY_DICT
@property
def mydict(self):
return self._mydict
@mydict.setter
def mydict(self, mydict):
if 'one' not in mydict:
raise OneMissingException
self._mydict = mydict
test_themodule.py
import pytest
from unittest import mock
from the_module import Test1, OneMissingException
@pytest.fixture(scope='function')
def my_dict():
return {'one': 1, 'two': 2, 'three': 3}
def test_verify_test1_exception(my_dict):
my_dict.pop('one') # comment this out and test still passes
with mock.patch("the_module.MY_DICT") as mydict:
mydict.return_value.return_value = my_dict
with pytest.raises(OneMissingException):
Test1()
在你的情况下你不需要模拟(你试图以错误的方式使用它,因为没有人调用 MY_DICT 而你尝试了 return_value)
仅使用 pytest 的 monkeypatch fixture:
import pytest
from unittest import mock
from the_module import Test1, OneMissingException
@pytest.fixture
def patched_my_dict(monkeypatch):
patched = {'one': 1, 'two': 2, 'three': 3}
monkeypatch.setattr("the_module.MY_DICT", patched)
return patched
def test_verify_test1_exception(patched_my_dict):
patched_my_dict.pop('one') # comment this out and test will not pass
with pytest.raises(OneMissingException):
Test1()