【问题标题】:Python unittest module diff consider `tzinfo=<UTC>` and `tzinfo=tzutc()` unequalPython unittest 模块差异考虑`tzinfo=<UTC>` 和`tzinfo=tzutc()` 不相等
【发布时间】:2018-10-09 09:38:51
【问题描述】:

我在 Python 的 unittest 模块中使用 assertListEqual() 时遇到问题。

当我执行self.assertListEqual(expected, result) 时,它会正确比较项目。但是当有一点差异时,我就会得到一个差异。在那个差异中,除了绝对不同的项目之外,我得到了很多行,例如:

问题是:我怎样才能摆脱它,只看到真正不同的元素?

要生成expected 时间戳,我使用dateutil.parser.parse 和Django 的ORM。

下面的示例代码表明:

from datetime import datetime
import unittest
import pytz

from dateutil.parser import parse


class Test(unittest.TestCase):

    def test_foo(self):

        expected = [{
            'value': 1,
            'timestamp': datetime(2018, 1, 1, 0, 0, 0, tzinfo=pytz.utc),
        }]

        result = [{
            'value': 0,
            'timestamp': parse('2018-01-01T00:00:00Z'),
        }]

        self.assertListEqual(expected, result)


if __name__ == '__main__':
    unittest.main()

【问题讨论】:

  • 请发一份代码。
  • @glenfant 你能再看看吗?我更新了描述

标签: python testing python-unittest


【解决方案1】:

试试这个:

from datetime import datetime
import unittest
import pytz

import dateutil
from dateutil.parser import parse


class Test(unittest.TestCase):

    def test_foo(self):

        expected = [{
            'value': 1,
            'timestamp': datetime(2018, 1, 1, 0, 0, 0, tzinfo=dateutil.tz.tz.tzutc()),
        }]

        result = [{
            'value': 1,
            'timestamp': parse('2018-01-01T00:00:00Z'),
        }]

        self.assertListEqual(expected, result)


if __name__ == '__main__':
    unittest.main()

【讨论】:

  • 解决方案有效,但是在原始代码中我使用 Django ORM 来获取列表之一,所以我唯一的选择是替换 parse 的 UTC 对象或 ORM 返回的 UTC 对象来匹配?跨度>
  • 看来 dateutils 不依赖 pytz 作为时区数据库,有自己的。这就是为什么你有这种差异。我不是 Django 专家。尝试找出 Django 使用什么来解析带有时区的序列化日期时间。
猜你喜欢
  • 1970-01-01
  • 2017-01-20
  • 2016-01-21
  • 2010-10-12
  • 2015-03-14
  • 1970-01-01
  • 2020-12-01
  • 2013-08-01
  • 1970-01-01
相关资源
最近更新 更多