1

我正在尝试使用模拟来使用 Python/Django 进行单元测试,但我无法让它工作。模拟的行为就像它从未被调用过一样。

测试.py

from my_module import my_library
my_library = MagicMock()

class MyTest(TestCase):
    def test_add(self):
        acronym = 'TEST'

        m = MyModel(acronym=acronym)
        m.save()

        my_library.add.assert_called_with(acronym=acronym)

my_library.py

def add(acronym):
    # Processing...

模型.py

class MyModel(Model):
    acronym = CharField(max_length=4)

    def save(self):
        my_library.add(acronym=self.acronym)

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

我的库有效,我知道函数 add 被正确调用。但是模拟似乎不起作用,因为它只是在我运行单元测试时引发异常:

AssertionError: Expected call: add(acronym='TEST')
Not called

我想我没有正确使用模拟的东西。任何人都可以帮助或提供建议吗?

4

2 回答 2

0

尝试使用patch

from mock import patch
from my_module import my_library


class MyTest(TestCase):
    def test_add(self):
        acronym = 'TEST'

        with patch('my_library.add') as add_method:   
            m = MyModel(acronym=acronym)
            m.save()

            add_method.assert_called_with(acronym=acronym)

希望这对你有用。

于 2013-06-03T06:51:47.683 回答
0

那是因为它永远不会被调用。程序的第一行执行以下操作:

my_library = __import__("my_module")

下一行只是盖过了第一行。它不会以任何方式改变 my_module,因此您的所有其他代码只是调用原始代码而不是模拟代码。

来看看吧mock.patch。要么像这样:

from mock import patch
import my_module as my_library

class MyTest(TestCase):
    def test_add(self):
        acronym = 'TEST'
        with patch.object(my_library, 'add') as add_method:   
            m = MyModel(acronym=acronym)
            m.save()
            add_method.assert_called_with(acronym=acronym)

或使用原始模块名称:

from mock import patch

class MyTest(TestCase):
    def test_add(self):
        acronym = 'TEST'
        with patch('my_module.add') as add_method:   
            m = MyModel(acronym=acronym)
            m.save()
            add_method.assert_called_with(acronym=acronym)
于 2013-06-03T07:11:25.503 回答