7

我正在尝试使用 App Engine 的 NDB 测试 DateTimeProperty 的过滤器,但我已将其设置为 auto_now?

有没有办法绕过这个进行单元测试?

例子:

class MyModel(ndb.Model)
  timestamp = ndb.DateTimeProperty(auto_now)
  name = ndb.StringProperty()


def testMyModelFilter(self):
  test1 = MyModel()
  test1.timestamp = datetime.datetime.now() - datetime.timedelta(hours=2)
  test1.put()
  test2 = MyModel()
  test2.timestamp = datetime.datetime.now() - datetime.timedelta(hours=1)
  test2.put()

  hour_ago = datetime.datetime.now() - datetime.timedelta(hours=1)
  fetched = MyModel.query().filter(MyModel.timestamp < hour_ago).fetch(
      None, keys_only=True)

不幸的是,当我使用 test.put() 将其提交到数据存储时,它使用的是 put() 的时间。

4

1 回答 1

10

因此,您可以尝试的一件事(正如@mjibson 所暗示的)是在测试期间覆盖您的模型。由于MyModel它本身是一个对象,因此您可以将 的_auto_now属性修改timestamp为 False 以进行测试。例如:

def testMyModelFilter(self):
  # Change the auto_now parameter to False
  MyModel.timestamp._auto_now = False

  # Test as usual...
  test1 = MyModel()
  test1.timestamp = datetime.datetime.now() - datetime.timedelta(hours=2)
  test1.put()
  test2 = MyModel()
  test2.timestamp = datetime.datetime.now() - datetime.timedelta(hours=1)
  test2.put()

  hour_ago = datetime.datetime.now() - datetime.timedelta(hours=1)
  fetched = MyModel.query().filter(MyModel.timestamp < hour_ago).fetch(
      None, keys_only=True)

我记得在其他地方看到过这种技术,所以如果我能找到它,我会链接(如果它有效,当然:))。

于 2012-10-23T08:05:06.053 回答