【问题标题】:How to stub Python methods without Mock如何在没有 Mock 的情况下存根 Python 方法
【发布时间】:2011-04-24 00:31:52
【问题描述】:

我是一名 C# 开发人员,正在研究一些 Python 的东西,所以我还不知道我在做什么。我读过你真的不需要使用 Python 进行依赖注入。有人告诉我,您可以在代码中实例化对象并让它们以您想要的方式运行,但是,您可以将这些对象上的方法指向我自己在测试中定义的存根——据说没有模拟。

这是真的吗?我已经尝试过,但无法让它正常工作。这实际上是如何完成的?如何在没有模拟库的情况下在 Python 中存根方法?

【问题讨论】:

    标签: python unit-testing mocking stub


    【解决方案1】:

    这是一个基本示例。请注意,从不调用生产 getData() 方法。它已经被一个存根模拟出来了。

    import unittest
    class ClassIWantToTest(object):
    
        def getData(self):
            print "PRODUCTION getData called"
            return "Production code that gets data from server or data file"
    
        def getDataLength(self):
            return len(self.getData())
    
    class TestClassIWantToTest(unittest.TestCase):
    
        def testGetDataLength(self):
            def mockGetData(self):
                print "MOCK getData called"
                return "1234"
    
            origGetData = ClassIWantToTest.getData
            try:
                ClassIWantToTest.getData = mockGetData
                myObj = ClassIWantToTest()
                self.assertEqual(4, myObj.getDataLength())
            finally:
                ClassIWantToTest.getData = origGetData
    
    if __name__ == "__main__":
        unittest.main()
    

    【讨论】:

    【解决方案2】:

    Python 函数是first-class objects,因此您可以将任何函数分配给标识符:

    class Person:
      def greetings(self):
        return "Hi!"
    
    def happy_greetings(self):
      return "Hi! You're awesome!"
    
    mike = Person()
    mike.greetings()  # "Hi!"
    
    Person.greetings = happy_greetings
    mike.greetings()  # "Hi! You're awesome!"
    

    将方法标识符视为对某个函数的引用。通过更改引用,Python 解释器将找到并执行它所引用的任何内容。但是,我建议您不要手动执行此操作,而是使用一些成熟的模块,例如 unittest.mock,因为存在很多陷阱,例如管理存根范围等。

    【讨论】:

      猜你喜欢
      • 2021-05-10
      • 1970-01-01
      • 2022-11-10
      • 2014-10-25
      • 2012-06-12
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多