2015-04-04 2 views
0

Я использую py.test и mock. Я не мог издеваться над константой. Мой тест изменяет значение dict, которое присваивается константе. Это должно привести к исключению в моем тесте, но пока это не так. Я не уверен, в чем проблема, и был бы признателен за любую помощь, которая бы выявила проблему. Спасибо.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() 

ответ

2

В вашем случае вам не нужно издеваться (и вы пытались использовать его в неправильном направлении, а никто не звонит MY_DICT, и вы пытались возвратить значение)

использование только pytest's monkeypatch арматура:

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

Благодарим за разъяснение этого. Однако я не совсем понимаю ваше объяснение. Можете ли вы помочь мне понять, как я неправильно исправил атрибут (постоянный)? – Dowwie

+0

Исправлена ​​опечатка –

Смежные вопросы