【问题标题】:TypeError: is_peak() missing 1 required positional argument: 'start_time' [closed]TypeError:is_peak()缺少1个必需的位置参数:'start_time'[​​关闭]
【发布时间】:2021-09-17 16:44:19
【问题描述】:

我似乎无法弄清楚为什么我的单元测试没有运行。 enter image description here

我正在尝试测试计算器类中的方法:

class Calculator():

    def __init__(self):
        pass

    def is_peak(self, start_time: str):
        time = start_time.split(':') 
        hour = time[0]
        int_hour = int(hour)
        if 6 <= int_hour < 18:
            return True
        else:
            return False

这是 unittest 的测试用例:

class TestCalculator(unittest.TestCase):

    def test_time(self):
        self.assertEqual(True, Calculator.is_time('9:40'))

【问题讨论】:

    标签: python unit-testing testing


    【解决方案1】:

    is_peak() 方法应该是静态方法,因为它是在没有初始化类的情况下调用的。

    由于没有对象被初始化,is_peak() 中的self 参数变得和其他参数一样。这就是您收到位置参数错误的原因。

    在你的课堂上试试这个:

    class Calculator():
        def __init__(self):
            pass
    
        @staticmethod
        def is_peak(start_time: str):
            time = start_time.split(':')  # Extracts the hour character from the string
            hour = time[0]
            int_hour = int(hour)
            if 6 <= int_hour < 18:
                return True
            else:
                return False
    

    相关问题:Static methods in Python?

    【讨论】:

      【解决方案2】:

      问题在于函数调用。

      self.assertEqual(True, Calculator.is_peak('9:40'))

      应该是这样的:

      self.assertEqual(True, Calculator().is_peak('9:40'))

      你的单元测试代码应该是这样的:

      class TestCalculator(unittest.TestCase):
      
          def test_peak(self):
              # testCase 1 (User enters a valid time in the peak hour)
              self.assertEqual(True, Calculator().is_peak('9:40'))
      
              # # testCase 2 (User enters a valid time in the off-peak hour)
              self.assertEqual(True, Calculator().is_peak('20:30'))
      

      说明:

      为什么我们应该使用Calculator() 而不是Calculator

      如果我们想要访问一个类的全部功能,我们必须使用Calculator() 创建一个类的对象。

      当像这样Calculator.is_peak() 进行函数调用时,它会将self 作为参数,但是当我们像这样调用Calculator().is_peak() 时,它会将self 作为类默认参数。

      我们可以从下面提到的 sn-ps 中看到 class 的不同行为。

      print(dir(Calculator.is_peak))

      ['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

      print(dir(Calculator().is_peak))

      ['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__func__', '__ge__', '__get__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

      【讨论】:

        猜你喜欢
        • 2021-09-12
        • 2022-01-18
        • 2020-09-03
        • 2022-01-27
        • 2021-12-30
        • 2021-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多