2017-04-06 11 views
1

os.environ.get을 도우려는 데 어려움을 겪고 있습니다.가져온 클래스의 파이썬에서 조롱하기

가져온 BaseClass가 있습니다. BaseClass 메서드를 sub_class 모듈로 가져올 때 해당 base_class 파일에서 os.environ.get 호출을 조롱하려고합니다.

project.data.base_class.py

from project.data.base_class import BaseClass 

class SubClass(BaseClass): 

    def __init__(self): 

    def run(self): 
    return self.get() 

import os 

class BaseClass(object): 
    VAR1 = os.environ.get('something') 
    VAR2 = os.environ.get('something') 

    def __init__(self): 
    pass 

    def get(self): 
    return BaseClass.VAR1 

project.data.sub_class.py 나는 SubClass.run 방법을 테스트 할,하지만 난 조롱하려고 할 때, 나는 바로 모의 os.environ에 대한 설정 얻이 수없는 것 . 여기에 내가 무엇을 시도했다입니다 :

from mock import patch 

@patch('base_class.os.environ') 
def test_sub_class_run(self, mock_base): 
    mock_base.get.side_effect = ['var1', 'var2'] 
    from sub_class import sub_class 
    self.assertEqual(sub_class.SubClass.run(), 'var1') 
from mock import patch 

@patch('sub_class.base_class.os.environ') 
def test_sub_class_run(self, mock_base): 
    mock_base.get.side_effect = ['var1', 'var2'] 
    from sub_class import sub_class 
    self.assertEqual(sub_class.SubClass.run(), 'var1') 

내가 os.environ 사용하고 때이 때문에 기분이, 내가 제대로 조롱하고 있지 않다. 나는 모의 구조를 구성하는 적절한 방법이 무엇인지 모른다고 주장한다. 정확히.

그건 내 의사 코드입니다.

+0

'mock_base.get.side.effect = [ 'var1', 'var2']'를'mock_base.get.side.effect = lambda * args : [ 'var1', 'var2'] '로 대체 해보십시오. –

+0

이 질문이 도움이 될 수 있습니다. http://stackoverflow.com/questions/31582750/python-mock-patch-os-environ-and-return-value?noredirect=1&lq=1 –

답변

0

문제를 해결하지 못했습니다. 나는 내 코드를 리팩토링해야했는데 그 이유는 그랬기 때문에 이것이 사실이라고 생각한다. 그러나 내가 틀렸다면 누군가가 이것을 고치도록 부탁해!

라이브러리를 패치하려고하면 패치 라이브러리가 가져 오는 스크립트 또는 모듈을 실제로 실행하는 것처럼 보입니다. 그래서 제 경우에는 OS 호출을 조롱하려고했지만 패치하려고했던 것의 OS 호출은 스크립트의 가장 바깥쪽에있었습니다. 패치 할 때 환경 변수가 존재하지 않았습니다. 내 환경 변수 검색을 내 수업으로 옮기고 패치를 시도해야했습니다.

이것은 잘못되었을 수 있으며 내가 한 일을 잘못 해석했지만 그게 내 문제를 해결 한 방법입니다.