3

我正在尝试模拟 django models.Model 上的保存方法调用。我使用 Mock 作为我的模拟库。

我正在测试位于 apps.deps.house_factory 的文件 house_factory.py 中的一个函数。

house_factory.py:从apps.market.models导入房子

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()

我想模拟出 House 模型。

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

任何帮助表示赞赏,

乔纳斯。

4

1 回答 1

4

“这是我第一次尝试认真对待 django 和测试”......你不需要模拟数据库保存,因为 Django 会自动创建一个测试数据库来在你运行时运行你的测试套件python manage.py test。然后只需断言存储在数据库中的值。

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

提示:使用内存数据库进行单元测试,例如sqlite将以下内容放入您的settings.py文件中:

if 'test' in sys.argv:
    DATABASES['default']['ENGINE'] = 'sqlite3'

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

于 2012-04-15T16:19:37.017 回答