模拟从未打过电话

时间:2013-06-04 07:07:14

标签: python django unit-testing mocking python-mock

我试图在我的单元测试中实现一个模拟,但它永远不会被调用,即使它应该。

tests.py

from mock import patch

class MyTest(TestCase):
    def test_add(self):
        name = 'Test'

        with patch('my_module.my_file.my_function') as add_method:
            m = MyModel(name=name)
            m.save()

        add_method.assert_called_with(name=name)

models.py

from my_module.my_file import my_function

class MyModel(Model):
    name = CharField(max_length=12)

    def save(self, *args, **kwargs):
        my_function(self.name)

        super(MyModel, self).save(*args, **kwargs)

my_file.py

def my_function(name):
    # Processing...

当我运行单元测试时,它只是告诉我模拟没有被调用,虽然它应该是,我知道脚本工作正常。你对我有什么想法/建议吗?

1 个答案:

答案 0 :(得分:1)

导入models时,它会运行from my_module.my_file import my_function,但尚未模拟。运行测试用例时,my_function模块中的models名称已绑定到 real 函数:修补my_files无效。

您需要修补models.my_function

with patch('models.my_function') as add_method:
    m = MyModel(name=name)
    m.save()

另一种方法是在my_file.my_function导入时修补models

请参阅where to patch文档。