【问题标题】:TypeError : strptime() argument 1 must be str, not NoneTypeError : strptime() 参数 1 必须是 str,而不是 None
【发布时间】:2020-02-28 07:27:32
【问题描述】:

我是 Python 新手。我有一个util.py 文件来检查日期时间的值。我为它写了一个测试用例,值为无。但我收到错误strptime() argument 1 must be str, not None。有人能告诉我如何解决吗?谢谢。

我的util.py

from datetime import date, datetime
import traceback
import time
from analyzer.analyzerlogging import setup_stopwatch, setup_logger


def validate_date(logger, val, parameter_name, date_format, date_format_info):
    """ Check if val is the date with correct format, then return the date
    """
    _val = None
    try:
        _val = datetime.strptime(val, date_format)
    except ValueError:
        msg = f"Invalid value {val} of parameter {parameter_name}. {parameter_name.capitalize()} should be at format '{date_format_info}'"
        logger.error(msg)
        raise Exception(msg)
    return _val

我的测试用例:

import unittest
from analyzer.util import validate_date
from datetime import date
import datetime
from analyzer.analyzerlogging import setup_logger


class TestUtilValidateDate(unittest.TestCase):

#val is None and date_format_info is YYYY/MM/DD HH:mm:ss
    def test_UT_UTIL_VALIDATE_DATE_005(self):
        try:
            validate_date(self.logger, None, 'param_name', '%Y/%m/%d %H:%M:%S', 'YYYY/MM/DD HH:mm:ss')
        except Exception as e:
            result = "Invalid value None of parameter param_name. Param_name should be at format 'YYYY/MM/DD HH:mm:ss'"
            self.assertEqual(str(e),result)

错误:

test_UT_UTIL_VALIDATE_DATE_005 (test_util_validate_date.TestUtilValidateDate) ... FAIL
NoneType: None

======================================================================
FAIL: test_UT_UTIL_VALIDATE_DATE_005 (test_util_validate_date.TestUtilValidateDate)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\Users\duongnb\Documents\SVN\trunk\src\Analyzer\toshiba\yieldnews\ut\test_util_validate_date.py", line 44, in test_UT_UTIL_VALIDATE_DATE_005
    validate_date(self.logger, None, 'param_name', '%Y/%m/%d %H:%M:%S', 'YYYY/MM/DD HH:mm:ss')
TypeError: strptime() argument 1 must be str, not None

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\Users\duongnb\Documents\SVN\trunk\src\Analyzer\toshiba\yieldnews\ut\test_util_validate_date.py", line 47, in test_UT_UTIL_VALIDATE_DATE_005
    self.assertEqual(str(e),result)
AssertionError: 'strptime() argument 1 must be str, not None' != "Invalid value None of parameter param_na[52 chars]:ss'"
- strptime() argument 1 must be str, not None
+ Invalid value None of parameter param_name. Param_name should be at format 'YYYY/MM/DD HH:mm:ss'


----------------------------------------------------------------------
Ran 1 test in 0.002s

FAILED (failures=1)

【问题讨论】:

  • 尝试将 ValueError 替换为 TypeError 或在 util.py 中添加另一个异常 TypeError
  • 另外,使用with self.assertRaises(TypeError, msg='...'): 而不是在测试中添加您自己的异常处理程序。并始终检查特定异常。

标签: python datetime python-unittest


【解决方案1】:

单元测试在您的代码中正常运行 - 它表明您的 try/except 未捕获正确的异常。将您的异常更改为TypeError,它将被捕获并返回消息。

如果您的目标是检查预期的错误和将 None 作为 arg1 传递产生的错误消息,则应使用 self.assertRaisesMesssage

mock_val = None
parameter_name = 'Foo'
date_format_info = 'YYYY/MM/DD HH:mm:ss'
expected_msg = f"Invalid value {mock_val} of parameter {parameter_name}. {parameter_name.capitalize()} should be at format '{date_format_info}'"

with self.assertRaisesMessage(TypeError, expected_msg):
    validate_date(self.logger, mock_val, parameter_name, '%Y/%m/%d %H:%M:%S', date_format_info)

【讨论】:

    猜你喜欢
    • 2020-07-11
    • 2018-09-04
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多