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

时间:2017-04-12 22:10:20

标签: python mocking

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

@$(MAKE) $(ARGS) $(PROJECT_DIR)$(_proj) $(_rule)

所以:Car()。poweredBy()。engineType()返回'BigandFast'

我有一个函数getEngineType(),它接受一个汽车并返回引擎类型:

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

class Car(object):
     def poweredBy(self):
         return Engine()

我想模拟getEngineType()函数,以便我可以更改结果:

def getEngineType(aCar):         
    return aCar.poweredBy().engineType()

但这仍然会回归'BigandFast'。这一行:

mockedCar.return_value.poweredBy.return_value.getEngineType.return_value ='SmallAndSlow'

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

  1. 如何在模拟

  2. 中指定engineType()的返回值
  3. 如果没有传递Car,语法会如何/不同 getEngineType()作为参数但在函数内部生成。

1 个答案:

答案 0 :(得分:0)

由于你开始使用Car 模拟并从那里设置return_value链,你需要实际实例化一辆汽车:

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类模拟开始,然后你获得一个Car对象模拟的返回值,然后是一个powersBy方法模拟,然后是一个engineType方法模拟,最后是返回值。

不幸的是,我可能没有在这里使用正确的词汇,但要点是:mockedCarCar 的模拟,你需要实例化它以访问您设置的return_value