我使用的是Plone 3.3.5,我正在为我的软件包编写一些测试。
在测试中,我需要检索自用户上次登录时间以来的所有PloneboardComment。
这是我正在使用的代码:
class FunctionalTestSetup(base.FunctionalTestCase):
[...]
def test_new_since_last_login(self):
# we log in as user1
userid = 'user1'
self.login(userid)
# XXX: last_login_time is not updated
self.updateLoginTime(userid)
# and we should get no msg since last login
new = getNewSinceLastLoginNr(self.forum, userid)
self.assertEquals(new,0)
def updateLoginTime(self, userid):
member = self.portal.portal_membership.getMemberById(userid)
member.setMemberProperties({'last_login_time': DateTime(),})
def getNewSinceLastLogin(forum, userid):
""" returns all the new msgs since user's last login
"""
acl = getToolByName(forum,'acl_users')
user = acl.getUserById(userid)
last_login = user.getProperty('last_login_time')
query = dict(
path = {'query':"/".join(forum.getPhysicalPath()),
'depth':-1,},
portal_type = "PloneboardComment",
created = {'query':last_login, 'range': 'min'},
)
brains = self.catalog(query)
return brains
在"afterSetup"上,我创建了一个有2条评论的论坛,但它们不应该被"getNewSinceLastLogin"计算,因为它们是在user1登录之前创建的。
无论如何,测试失败,因为在"self.assertEquals(new,0)"上,new=2而不是0。
奇怪的是,如果我打印所有的日期查询应该工作:
* last_login_time on login:
2011/12/07 13:44:24.131 GMT+1
* updated last_login_time:
2011/12/07 13:44:24.146 GMT+1
* last_login_time on catalog query:
2011/12/07 13:44:24.146 GMT+1
* creation date of comments:
2011/12/07 13:44:23.875 GMT+1
2011/12/07 13:44:24.019 GMT+1
是的,差异是相当薄,但即使在"updateLoginTime"之前放置"sleep(10)"也不起作用。
奇怪的是,如果我在检查之前放置"sleep(30)",或者如果我在测试中放置pdb,并且我在几秒钟后手动调用这些方法,我得到0(!!),这是正确的查询结果。
我不知道这里出了什么问题…对于这种查询是否有特定于测试的设置?为什么即使我在创建之后"手动"重新索引每个对象,目录也需要一直保持最新?
可能是因为日期四舍五入到5分钟。看看这些票:#11827、#11936和#11827