从导入的类在Python中模拟

从导入的类在Python中模拟,python,unit-testing,mocking,python-mock,Python,Unit Testing,Mocking,Python Mock,我很难模仿os.environ.get希望你能帮助我 我有一个导入的基类。我试图在将基类方法导入子类模块时模拟该基类文件中的os.environ.get调用 project.data.base\u class.py import os class BaseClass(object): VAR1 = os.environ.get('something') VAR2 = os.environ.get('something') def __init__(self): pass

我很难模仿
os.environ.get
希望你能帮助我

我有一个导入的基类。我试图在将基类方法导入子类模块时模拟该基类文件中的os.environ.get调用

project.data.base\u 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
from project.data.base_class import BaseClass

class SubClass(BaseClass):

  def __init__(self):

  def run(self):
    return self.get()
project.data.sub_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
from project.data.base_class import BaseClass

class SubClass(BaseClass):

  def __init__(self):

  def run(self):
    return self.get()
我想测试
子类.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

我觉得,因为当我使用os.environ时,我没有正确地模仿。我不确定构造mock的合适方法是让它模拟操作系统调用。对


这或多或少是我的伪代码。

我没有解决这个问题。我确实必须重构我的代码,原因是,我认为这是真的,但如果我错了,请有人纠正

看起来,当您尝试修补库时,修补库似乎实际运行您正在导入的脚本或模块。因此,在我的例子中,我试图模拟一个操作系统调用,但我试图修补的操作系统调用位于脚本的最外层。当我试图修补它时,我的环境变量不存在。我必须将环境变量检索移到我的类中,然后尝试修补


这可能是错误的,我误解了我所做的,但这就是我解决问题的方法

我没有解决这个问题。我确实必须重构我的代码,原因是,我认为这是真的,但如果我错了,请有人纠正

看起来,当您尝试修补库时,修补库似乎实际运行您正在导入的脚本或模块。因此,在我的例子中,我试图模拟一个操作系统调用,但我试图修补的操作系统调用位于脚本的最外层。当我试图修补它时,我的环境变量不存在。我必须将环境变量检索移到我的类中,然后尝试修补


这可能是错误的,我误解了我所做的,但这就是我解决问题的方法

尝试用
mock\u base.get.side\u effect=lambda*args:['var1',var2']
替换
mock\u base.get.side\u effect=lambda*args:['var1',var2']
这个问题可能会有帮助: