模拟整个python类

时间:2016-08-17 19:13:33

标签: python unit-testing magicmock

我试图在python中进行一个简单的测试,但是我无法弄清楚如何完成模拟过程。

这是类和def代码:

class FileRemoveOp(...)
    @apply_defaults
    def __init__(
            self,
            source_conn_keys,
            source_conn_id='conn_default',
            *args, **kwargs):
        super(v4FileRemoveOperator, self).__init__(*args, **kwargs)
        self.source_conn_keys = source_conn_keys
        self.source_conn_id = source_conn_id


    def execute (self, context)
          source_conn = Connection(conn_id)
          try:
              for source_conn_key in self.source_keys:
                  if not source_conn.check_for_key(source_conn_key):    
                      logging.info("The source key does not exist")  
                  source_conn.remove_file(source_conn_key,'')
          finally:
              logging.info("Remove operation successful.")

这是我对执行功能的测试:

@mock.patch('main.Connection')
def test_remove_execute(self,MockConn):
    mock_coon = MockConn.return_value
    mock_coon.value = #I'm not sure what to put here#
    remove_operator = FileRemoveOp(...)
    remove_operator.execute(self)

由于执行方法尝试建立连接,我需要嘲笑,我不想做一个真正的连接,只是返回一些模拟。我该怎么做?我曾经习惯用Java进行测试,但我从未在python上做过测试..

2 个答案:

答案 0 :(得分:13)

首先,非常重要的是要了解你总是需要模拟你试图模仿的东西,如unittest.mock文档中所述。

  

基本原则是你修剪一个对象的位置,   它不一定与定义它的位置相同。

接下来,您需要做的是将MagicMock实例作为已修补对象的return_value返回。总而言之,您需要使用以下序列。

  • 补丁对象
  • 准备使用MagicMock
  • 返回我们刚创建的MagicMock

这是一个项目的快速示例。

connection.py(我们想要模拟的课程)

return_value

file.py(使用类的地方)

class Connection(object):                                                        
    def execute(self):                                                           
        return "Connection to server made"

<强>测试/ test_file.py

from project.connection import Connection                                        


class FileRemoveOp(object):                                                      
    def __init__(self, foo):                                                     
        self.foo = foo                                                           

    def execute(self):                                                           
        conn = Connection()                                                      
        result = conn.execute()                                                  
        return result    

答案 1 :(得分:0)

我发现这个简单的解决方案可在python3中使用:您可以在首次导入整个类之前替换整个类。说我必须从real.manager模拟类'Manager'

class MockManager:
    ...

import real.manager
real.manager.Manager = MockManager

如果没有更好的位置,可以在 init .py中进行此替换。 它也可以在python2中工作,但我没有检查。