我有以下情况:
在我的models.py
中class FooBar(models.Model):
description = models.CharField(max_length=20)
在我的utils.py文件中。
from models import FooBar
def save_foobar(value):
'''acts like a helper method that does a bunch of stuff, but creates a
FooBar object and saves it'''
f = FooBar(description=value)
f.save()
在tests.py
中from utils import save_foobar
@patch('utils.FooBar')
def test_save_foobar(self, mock_foobar_class):
save_mock = Mock(return_value=None)
mock_foobar_class.save = save_mock
save_foobar('some value')
#make sure class was created
self.assertEqual(mock_foobar_class.call_count, 1) #this passes!!!
#now make sure save was called once
self.assertEqual(save_mock.call_count, 1) #this fails with 0 != 1 !!!
这是我正在尝试做的简化版本...所以请不要为什么我有一个utils文件和一个帮助函数(在现实生活中它做了几件事)。此外,请注意,虽然简化,这是我的问题的实际工作示例。第一次调用call_count会返回1并传递。但是,第二个返回0.因此,看起来我的补丁正在工作并被调用。
我怎样才能测试不仅会创建一个FooBar实例,还会调用它上面的save方法?
答案 0 :(得分:8)
这是你的问题,你现在有:
mock_foobar_class.save = save_mock
因为mock_foobar_class
是一个模拟的类对象,并且在该类的实例(不是类本身)上调用save
方法,所以需要断言在返回值上调用save该类(又名实例)。
试试这个:
mock_foobar_class.return_value.save = save_mock
我希望有所帮助!