我正在尝试使用模拟器对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。但是模拟似乎不起作用,因为它只是在我运行单元测试时引发异常:
AssertionError: Expected call: add(acronym='TEST')
Not called
我想我没有正确使用模拟的东西。有人可以帮忙或给出建议吗?
答案 0 :(得分: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)
希望对你有用。
答案 1 :(得分: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)