Python 我能';别开玩笑去上班

Python 我能';别开玩笑去上班,python,django,unit-testing,mocking,python-mock,Python,Django,Unit Testing,Mocking,Python Mock,我试图使用一个模拟来进行Python/Django的单元测试,但我就是无法让它工作。模拟的行为就像从未被调用过一样 tests.py from my_module import my_library my_library = MagicMock() class MyTest(TestCase): def test_add(self): acronym = 'TEST' m = MyModel(acronym=acronym) m.sav

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

tests.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...
models.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函数。但是mock似乎不起作用,因为它只是在我运行单元测试时引发en异常:

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

我想我没有正确地使用mock这个词。有人能提供帮助或建议吗?

尝试使用
补丁程序

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)

希望它对你有用。

那是因为它从未被调用过。程序的第一行执行以下操作:

my_library = __import__("my_module")
下一行刚好盖过第一行。它不会以任何方式改变my_模块,因此所有其他代码只调用原始代码而不是mock

请查看
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)

感谢您的解释,尽管我已经尝试使用mock.patch实现alecxe的解决方案,但mock仍然没有被调用。即使尝试了第二个解决方案,仍然无法工作。没有调用模拟。还有其他解决方案吗?我又试了好几次,但还是不起作用。根本不调用mock。