如何在Python中用mock对象替换函数进行单元测试

时间:2014-10-02 17:51:14

标签: python fabric

如何用Python中的模拟对象替换函数的所有引用?

我试图为Fabric脚本编写一些单元测试。具体来说,我想将fabric.api.run替换为记录命令而不是执行的模拟版本。但是,我想以某种方式执行此操作,因此我不必重写所有引用结构的代码。

我已经尝试过:

import fabric.api
_run = fabric.api.run
fabric.api.run = my_mock_run_function

但由于我无法保证在任何其他模块导入fabric.api之前会运行,因此很多代码仍在使用真正的run函数。

2 个答案:

答案 0 :(得分:1)

如果您的代码使用:

.ipa

你必须修补你的模块对run函数的本地引用:

with open("scores.txt", "a") as file:
    file.write("%s, %s\n" % (name, number_correct))
with open("scores.txt", "r") as file:
    data = [line.split(", ") for line in file.read().split("\n")]

data = sorted(data, key = lambda x: -int(x[1]))

print("\n".join(["%s\t%s" % (i[0], i[1]) for i in data]))

如果您的代码使用:

from fabric.api import run

您将能够修补原始副本:

@patch('yourmodule.run')
def test_method(self, run):
    pass

请参阅this nice explanation

答案 1 :(得分:0)

使用unittest.mock.patch

import fabric.api
import unittest
from unittest.mock import Mock, patch

class TestCases(unittest.TestCase):
    @patch('fabric.api.run')
    def test_test(self):
        self.assertTrue(True)