我正在尝试在django models.Model上模拟一个save方法调用。 我正在使用Mock作为我的模拟库。
我正在测试文件house_factory.py中的一个函数,该文件位于apps.deps.house_factory。
house_factory.py: 来自apps.market.models import House
def create_house(location, date, price):
house = House(id=None, date, price)
house.save()
# calculate some stuff and further expand the house instance
# for example house.tag.add("some-tag")
# save after calculations
house.save()
我想嘲笑众议院模特。
class HouseModelMock(mock.Mock):
def save(self):
pass
测试方法,是unittest.TestCase类的一部分
@patch('apps.deps.house_factory.House', new_callable=HouseModelMock)
def create_house_test(self, MockedHouse):
""" Constants """
DAYS_FROM_TODAY = 55
DATE = datetime.date.today() + datetime.timedelta(days=DAYS_FROM_TODAY)
PRICE = 250000
# A location is also a django module , I'm using factory_boy here for building a 'mocked' location
location = LocationFactory.build()
create_house(DATE, PRICE)
MockedHouse.assert_called_with(None, DATE, PRICE)
MockedHouse.save.assert_called_with()
如果我运行此测试,我会得到:
call__ return self.call(* arg,** kw) 的MemoryError
这是我第一次认真对待django和测试的尝试之一。所以也许我设置错误,模拟数据库调用。
感谢任何帮助,
纳斯。
答案 0 :(得分:3)
“这是我第一次尝试认真对待django并测试”...你不需要模拟数据库保存,因为Django自动creates a test DB运行你的测试套件,无论你何时运行{{ 1}}。然后简单地断言存储在数据库中的值。
理想情况下mock用于修补自己的测试(和逻辑),而不是默认的Django。
提示:在内存db 中使用进行单元测试,例如python manage.py test
将以下内容放在sqlite
文件中:
settings.py
这将显着加快您的测试运行。