wag*_*639 7 python google-app-engine app-engine-ndb
我正在尝试使用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)
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我使用test.put()将其提交到数据存储区时,它会使用put()时的时间.
Roc*_*key 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)
Run Code Online (Sandbox Code Playgroud)
我记得在其他地方看过这种技术,所以如果我能找到它我会链接(如果它可以工作,当然:)).