【问题标题】:Mocking django's database save模拟 django 的数据库保存
【发布时间】:2012-04-27 04:01:03
【问题描述】:

我正在尝试模拟 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()

如果我运行这个测试,我会得到:

呼叫__ 返回 self.call(*arg, **kw) 内存错误

这是我第一次尝试认真对待 django 和测试。所以也许我设置错误,模拟数据库调用。

感谢您的帮助,

乔纳斯。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    这将大大加快您的测试运行速度。

    【讨论】:

      猜你喜欢
      • 2020-07-11
      • 1970-01-01
      • 2017-09-04
      • 2016-07-07
      • 2021-06-28
      • 2012-07-30
      • 2021-05-03
      • 2013-08-23
      • 2017-12-27
      相关资源
      最近更新 更多