Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python模拟-了解概念和必要性_Python_Unit Testing_Testing_Mocking - Fatal编程技术网

Python模拟-了解概念和必要性

Python模拟-了解概念和必要性,python,unit-testing,testing,mocking,Python,Unit Testing,Testing,Mocking,首先,我真的想了解为什么要使用mocking(Python Mock库)。 为了测试某个东西而快速创建一个小对象和使用一个模拟对象有什么区别 与其他方法相比,模仿有哪些优点(我真的需要一些“真实”的例子来理解这一点)?在某些情况下,模仿是必要的吗 另外:模拟对象和magicmock对象之间有什么区别?如何连接 第二件事是嘲笑什么/在哪里。 例如,我应该只模拟数据库查询结果吗? 我的意思是:模拟的数据应该总是远程的吗 tl;dr:请向从未在任何语言中使用过Python的人解释模拟概念。模拟对象旨在

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

为了测试某个东西而快速创建一个小对象和使用一个模拟对象有什么区别

与其他方法相比,模仿有哪些优点(我真的需要一些“真实”的例子来理解这一点)?在某些情况下,模仿是必要的吗

另外:模拟对象和magicmock对象之间有什么区别?如何连接

第二件事是嘲笑什么/在哪里。

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


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

模拟对象旨在快速、轻松地表示某个复杂对象,而无需在测试期间手动检查并设置该对象的存根。它只是一个有用的工具,可以让编写测试变得更简单

至于模拟的内容/位置,应模拟测试模块外部的任何内容。您只需要测试当前模块代码,而不是被测试模块调用的某个模块的代码

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

import simplejson

def my_fn(args):
  return simplejson.dumps({'args': args})
您需要测试的只是函数my\u fn对simplejson.dumps()进行了正确的调用,因此您可以模拟simplejson。您并不真正关心传递给simplejson的对象是否正确地转换为json作为simplejson模块范围内的测试(simplejson模块有自己的测试集,如果您愿意,可以运行这些测试)

请注意,mock.patch只是为特定测试注入和移除mock的一种好方法。运行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'})

可能的重复:但是这里没有关于Python的内容,尽管它有一小部分答案。此外,这里没有太多的例子。我的情况是:我从未使用过模仿,现在我必须使用Python来模仿东西。我需要一些类似“用Python为傻瓜嘲笑”的东西@用户2091046+1,因为我有这些问题。但事实上,这就像一个问题中的五个问题,很可能应该分开。例如。,
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'})