Python:如何模拟依赖函数调用的结果并指定其返回的内容

Python:如何模拟依赖函数调用的结果并指定其返回的内容,python,mocking,Python,Mocking,我试图模拟嵌套函数调用的返回值。这应该很简单,但不起作用。 所以我有一个Car类,它有一个poweredBy()成员函数,返回Engine类的一个实例。 Engine类有一个成员getEngineType(),该成员返回字符串“BigandFast” class Engine(object): def engineType(self): return 'BigandFast' class Car(object): def poweredBy(self):

我试图模拟嵌套函数调用的返回值。这应该很简单,但不起作用。 所以我有一个Car类,它有一个poweredBy()成员函数,返回Engine类的一个实例。 Engine类有一个成员getEngineType(),该成员返回字符串“BigandFast”

class Engine(object):
    def engineType(self):
        return 'BigandFast'

class Car(object):
     def poweredBy(self):
         return Engine()
所以:Car().poweredBy().engineType()返回'BigandFast'

我有一个函数getEngineType(),它接受一辆汽车并返回发动机类型:

def getEngineType(aCar):         
    return aCar.poweredBy().engineType()
我想模拟getEngineType()函数,以便更改结果:

@mock.patch('testing.scratch.mock_test.Car')
def mockedCar(mockedCar):
 mockedCar.return_value.poweredBy.return_value.getEngineType.return_value = 'SmallAndSlow' 
 print getEngineType(mockedCar)
但这仍然返回“BigandFast”。该行:

mockedCar.return\u value.poweredBy.return\u value.getEngineType.return\u value='SmallAndSlow'

对我在调试器中看到的模拟对象没有任何影响。 因此,我的问题是:

  • 如何在模拟中指定engineType()的返回值

  • 如果汽车没有进入,语法会有什么不同 getEngineType()作为参数,但在函数内部生成


  • 由于您从一个Car类mock开始,并从那里设置
    return\u值
    链,因此您需要实际实例化一辆车:

    import mock
    class Engine(object):
        def engineType(self):
            return 'BigandFast'
    
    class Car(object):
         def poweredBy(self):
             return Engine()
    
    def getEngineType(aCar):
        return aCar.poweredBy().engineType()
    
    @mock.patch('__main__.Car')
    def mockedCar(mockedCar):
        mockedCar.return_value.poweredBy.return_value.engineType.return_value = 'SmallAndSlow'
        c = Car()
        print getEngineType(c)
    
    mockedCar()
    
    输出:

    SmallAndSlow
    
    因此,首先是一个Car类mock,然后是Car对象mock的返回值,然后是poweredBy方法mock,然后是engineType方法mock,最后是返回值


    不幸的是,我可能没有在这里使用正确的词汇,但要点是:
    mockedCar
    是对
    Car
    类的模拟,你需要实例化它来访问你设置的
    返回值

    不应该
    mockedCar.return\u value.poweredBy.return\u value.getEngineType.return\u value
    be
    mockedCar.return\u value.poweredBy.return\u value.engineType.return\u value
    ?那么getEngineType的结果是一个“空”模拟:不是“SmallAndSlow”