嘲笑django的数据库保存

时间:2012-04-15 16:13:02

标签: python django unit-testing mocking django-unittest

我正在尝试在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和测试的尝试之一。所以也许我设置错误,模拟数据库调用。

感谢任何帮助,

纳斯。

1 个答案:

答案 0 :(得分:3)

“这是我第一次尝试认真对待django并测试”...你不需要模拟数据库保存,因为Django自动creates a test DB运行你的测试套件,无论你何时运行{{ 1}}。然后简单地断言存储在数据库中的值。

理想情况下mock用于修补自己的测试(和逻辑),而不是默认的Django。

提示:在内存db 中使用进行单元测试,例如python manage.py test将以下内容放在sqlite文件中:

settings.py

这将显着加快您的测试运行。