Skip to main content
 首页 » 编程设计

python之py.test -- 模拟常量并在测试函数中引发异常

2025年05月04日15落叶

我正在使用 py.test 和 mock。我一直无法模拟一个常量。我的测试修改了分配给常量的字典值。这应该在我的测试中引发异常,但到目前为止它没有。我不确定问题出在哪里,如果能帮助查明问题,我将不胜感激。谢谢。

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()