2017-04-06 5 views
1

Ich habe eine harte Zeit verspotten os.environ.get in der Hoffnung, Sie können helfen.Verspotten in Python von einer importierten Klasse

Ich habe eine BaseClass, die importiert wird. Ich versuche, den Aufruf os.environ.get in dieser base_class-Datei zu verspotten, wenn die BaseClass-Methode in das Modul sub_class importiert wird.

project.data.base_class.py

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

from project.data.base_class import BaseClass 

class SubClass(BaseClass): 

    def __init__(self): 

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

Ich möchte die SubClass.run Methode testen, aber wenn ich spöttisch versuchen, kann ich nicht die richtige mock scheinen für os.environ einrichten zu erhalten . Hier ist, was ich versucht habe:

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 

und

@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') 

Ich fühle mich wie wegen, wenn ich verwende os.environ, ich nicht richtig sind spöttisch. Ich bin mir nicht wirklich sicher, was der richtige Weg ist, den Schein zu strukturieren, um ihn dazu zu bringen, diesen Aufruf zu verspotten. richtig.

Das ist mein Pseudocode mehr oder weniger.

+0

Ersetzen Sie 'mock_base.get.side_effect = ['var1', 'var2']' mit 'mock_base.get.side_effect = lambda * args: ['var1', 'var2']' –

+0

Diese Frage kann hilfreich sein : http://stackoverflow.com/questions/31582750/python-mock-patch-os-environ-and-return-value?noredirect=1&lq=1 –

Antwort

0

Ich habe das Problem nicht gelöst. Ich musste meinen Code umgestalten und der Grund war, weil, und ich denke, das ist wahr, aber bitte korrigieren Sie dies, wenn ich falsch liege!

Wenn Sie versuchen, eine Bibliothek zu patchen, sieht es so aus, als ob die Patch-Bibliothek tatsächlich das zu importierende Skript oder Modul ausführt. In meinem Fall versuchte ich also, einen OS-Aufruf zu verspotten, aber der OS-Aufruf der Sache, die ich zu patchen versuchte, befand sich in der äußersten Schicht meines Skripts. Wenn ich versuchen würde, es zu patchen, existierte meine Umgebungsvariable nicht. Ich musste den Abruf der Umgebungsvariable in meine Klasse verschieben und dann versuchen, einen Patch zu erstellen.

Das könnte falsch sein und ich habe falsch interpretiert, was ich getan habe, aber so habe ich mein Problem gelöst.

Verwandte Themen