【问题标题】:Python mocking- understand the concept and necessityPython mocking-理解概念和必要性
【发布时间】:2013-11-23 23:36:18
【问题描述】:

首先我真的很想了解为什么要使用模拟(Python Mock 库)。

快速制作一个小对象以满足测试需求和使用模拟对象有什么区别?

与其他方法相比,mock 有什么优势(我真的需要一些“活”的例子来理解这个)?在某些情况下模拟是否必不可少?

另外:mock 对象和magicmock 对象有什么区别?它们如何连接?

第二件事是模拟什么/在哪里。

我应该只模拟例如数据库查询结果吗? 我的意思是:模拟数据是否应该始终是远程数据?

tl;dr:请向从未在任何语言中使用过它的人解释 Python 中的模拟概念。

【问题讨论】:

  • 但是那里没有关于 Python 的内容,尽管它有一小部分答案。此外,那里没有太多的例子。我的情况是:我从来没有使用过模拟,现在我必须使用 Python 来模拟。我需要类似“Mocking in Python for dummy”之类的东西;)
  • @user2091046 +1 因为我有这些问题。不过说真的,这就像五题合一,应该是分开的吧。例如,stackoverflow.com/questions/4370617/…

标签: python unit-testing testing mocking


【解决方案1】:

模拟对象旨在快速轻松地表示一些复杂对象,而无需在测试期间手动检查并设置该对象的存根。它只是一个有用的实用程序,可以让编写测试更容易一些。

至于要模拟什么/在哪里模拟,应模拟被测模块外部的任何内容。您要测试的只是当前模块代码,而不是被测模块正在调用的某些模块的代码。

一个简单的例子是一些使用 simplejson 模块的代码。

import simplejson

def my_fn(args):
  return simplejson.dumps({'args': args})

您要测试的只是函数 my_fn 正确调用了 simplejson.dumps(),因此您可以模拟 simplejson。您并不真正关心传递给 simplejson 的对象是否被正确转换为 json,因为该测试在 simplejson 模块的范围内(如果您愿意,可以运行它自己的一组测试)。

import working_code
import mock

@mock.patch('working_code.simplejson')
def test_my_fn(mock_simplejson):
    working_code.my_fn('test-args')
    mock_simplejson.dumps.assert_called_with({'args': 'test-args'})

请注意,mock.patch 只是为特定测试注入和删除模拟的好方法。 test_my_fn 运行后,working_code.simplejson 恢复到函数调用前的状态。如果这令人困惑,您可以将测试示例视为:

import working_code
import mock

def test_my_fn():
    mock_simplejson = mock.Mock()
    working_code.simplejson = mock_simplejson
    working_code.my_fn('test-args')
    mock_simplejson.dumps.assert_called_with({'args': 'test-args'})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多