Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.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中的stubing与mock_Python_Unit Testing_Mocking_Stub - Fatal编程技术网

Python中的stubing与mock

Python中的stubing与mock,python,unit-testing,mocking,stub,Python,Unit Testing,Mocking,Stub,我想模拟或存根一个函数进行测试。我不确定我的术语是否正确,如果我错了,请纠正我,但我理解模拟是使用类似于的模拟库来创建假对象,并且对它将接收什么参数和返回什么有期望,这对我来说似乎有点过分了,因为我只想让mock/stubbed方法返回一个设置值 我认为存根只是“没有图书馆的嘲弄”,就像你的答案一样。从我看来,这正是我想要的。它轻巧而简单,你不必为了简单的案例而胡乱处理所有的模拟选项 我的问题是,这样做安全吗?上面的问题似乎覆盖了一个方法的内存表示,它似乎不正确。python社区是否接受这一点?

我想模拟或存根一个函数进行测试。我不确定我的术语是否正确,如果我错了,请纠正我,但我理解模拟是使用类似于的模拟库来创建假对象,并且对它将接收什么参数和返回什么有期望,这对我来说似乎有点过分了,因为我只想让mock/stubbed方法返回一个设置值

我认为存根只是“没有图书馆的嘲弄”,就像你的答案一样。从我看来,这正是我想要的。它轻巧而简单,你不必为了简单的案例而胡乱处理所有的模拟选项

我的问题是,这样做安全吗?上面的问题似乎覆盖了一个方法的内存表示,它似乎不正确。python社区是否接受这一点?还是一直鼓励使用适当的模拟库


编辑如果您没有在finally块中重新分配方法(如链接的答案所述),会发生什么可怕的事情?

我想自己将该方法存根的主要原因是,这样我就不必担心一个模拟并进行设置。然而,我发现这是一种使用
mock
库和注释的极好方法,这比手动创建
mock
的实例容易得多。以下是摘录:

rm.py

rmtest.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from mymodule import rm

import mock
import unittest

class RmTestCase(unittest.TestCase):

    @mock.patch('mymodule.os.path')
    @mock.patch('mymodule.os')
    def test_rm(self, mock_os, mock_path):
        # set up the mock
        mock_path.isfile.return_value = False

        rm("any path")

        # test that the remove call was NOT called.
        self.assertFalse(mock_os.remove.called, "Failed to not remove the file if not present.")

        # make the file 'exist'
        mock_path.isfile.return_value = True

        rm("any path")

        mock_os.remove.assert_called_with("any path")

要检查您的测试是否安全,请编写另一个测试来测试您的模拟。没有什么比元测试更好的了!实际上,您所描述的(返回设置值的对象)正是内置模拟库所做的,正如您从链接到的文档页面所看到的。模拟和存根之间的主要公认区别在于存根返回测试需要通过的数据,并且决不会导致测试失败。模拟用于验证对不同组件之间交互的期望。模拟和存根都可以在没有库的情况下完成。
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from mymodule import rm

import mock
import unittest

class RmTestCase(unittest.TestCase):

    @mock.patch('mymodule.os.path')
    @mock.patch('mymodule.os')
    def test_rm(self, mock_os, mock_path):
        # set up the mock
        mock_path.isfile.return_value = False

        rm("any path")

        # test that the remove call was NOT called.
        self.assertFalse(mock_os.remove.called, "Failed to not remove the file if not present.")

        # make the file 'exist'
        mock_path.isfile.return_value = True

        rm("any path")

        mock_os.remove.assert_called_with("any path")