【问题标题】:How to make unit tests for a methods in complicated class in python?如何对python中复杂类中的方法进行单元测试?
【发布时间】:2015-09-10 09:31:35
【问题描述】:

我想为 filename_to_txt 方法创建单元测试:

class some_panel(wx.Panel):
    def __init__(self,parent,Some_class,some_handler,Some_Event):
        wx.Panel.__init__(self,parent=parent)
        self.parent = parent
        self.some_handler = some_handler
        self.some_Event = Some_Event
        self.some_another_class = Some_class

    def filename_to_txt(self,input_filename):
        splitted = input_filename.split(".raw")
        txt_filename  = splitted[0] + splitted[1] + ".txt"
        return txt_filename

我应该如何为该方法编写单元测试?

它是某个类中的静态方法,但要测试它首先我必须创建 Some_panel 类的实例。

我真的必须为 Some_panel 类的 __init__ 方法提供所有参数吗?是否有另一种更好的方法,我不必为此创建 Some_panel 类的实例来测试 filename_to_txt 方法。

import unittest
from some_file import Some_panel

class TestSomething(unittest.TestCase):
    def testname(self):
        some_panel = Some_panel( ???? )
        testfilename = "TestFilename.raw.001"
        result = some_panel.filename_to_txt(input_filename = testfilename)
        self.assertEqual(result, "TestFilename.001.txt", "Something is wrong")

【问题讨论】:

    标签: python class testing initialization python-unittest


    【解决方案1】:

    如果是静态方法,请移除 self 参数并使用 @staticmethod 装饰器对其进行装饰。然后,您可以使用 some_panel.filename_to_text(filename) 将其作为纯函数调用。

    【讨论】:

    • 感谢您的回答!但是如果我不能改变来源呢?这是创建从 Some_panel 类继承并重写 init 方法只是为了传递的新类的正确方法吗?
    • 如果您无法更改源,那么对some_panel.filename_to-text 的调用将要求some_panel 的实例)或其子类)作为第一个参数,因此您别无选择,只能创建一个实例,然后调用该方法。子类将继承__init__(),除非它定义了自己的。如果这样做,则需要显式调用some_panel.__init__() - 最好通过使用super
    【解决方案2】:

    我认为最好的方法是删除 SomePanel 类。

    class SomePanelStub(SomePanel):
      def __init__(self):
        self.parent = None
        self.some_handler = None
        self.some_Event = None
        self.some_another_class = None
    

    现在在你的单元测试类中

    def SetUp(self):
      self.helper = SomePanelStub()
    

    现在您已经删除了 SomePanel,并且可以轻松地模拟出任何依赖项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多