如何测试不返回任何内容的方法?

2024-10-01 11:21:12 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我最近制作的工具中的代码,我正在尝试编写unittest,我有一个idea of how to test a method that returns something,但不知道如何测试不喜欢下面的方法:

def buildUi(self):
    self.label = QtGui.QLabel()
    self.label.setAlignment(QtCore.Qt.AlignCenter)
    self.setCentralWidget(self.label)

def nextImage(self):
    """ switch to next image or previous image
    """
    if self._imagesInList:
        if self._count == len(self._imagesInList):
            self._count = 0

        self.showImageByPath(
                self._imagesInList[self._count])

        if self.animFlag:
            self._count += 1
        else:
            self._count -= 1


def showImageByPath(self, path):
    if path:
        image = QtGui.QImage(path)
        pp = QtGui.QPixmap.fromImage(image)
        self.label.setPixmap(pp.scaled(
                self.label.size(),
                QtCore.Qt.KeepAspectRatio,
                QtCore.Qt.SmoothTransformation))

def playPause(self):
    if not self._pause:
        self._pause = True
        self.updateTimer.start(2500)
        return self._pause
    else:
        self._pause = False
        self.updateTimer.stop()

def keyPressEvent(self, keyevent):
    """ Capture key to exit, next image, previous image,
        on Escape , Key Right and key left respectively.
    """
    event = keyevent.key()
    if event == QtCore.Qt.Key_Escape:
        self.close()
    if event == QtCore.Qt.Key_Left:
        self.animFlag = False
        self.nextImage()
    if event == QtCore.Qt.Key_Right:
        self.animFlag = True
        self.nextImage()
    if event == 32:
        self._pause = self.playPause()

完整的查找代码可以找到here

有没有可能测试以上这些方法,或者我必须修改以使它们可测试? 编辑:更新:

^{pr2}$

第一次测试什么时候self.show.animFlag如果为True,则工作正常,但当我手动设置animFlag=False时,第二次测试失败。在


Tags: tokeyimageselfeventifdefcount
1条回答
网友
1楼 · 发布于 2024-10-01 11:21:12

这就是在代码之后编写unittest的问题——然后你就会意识到你的代码很难测试。在编写代码之前编写测试(好吧,真的“跟着”代码——在开始编码之前,你不需要编写所有的所有的测试,但是在测试之前你还是不写一行代码)可以确保你不会遇到这样的问题。在

现在即使使用“测试优先”方法,也必须测试不返回任何内容的方法。方法是测试预期的副作用。其中一些副作用很容易测试-在上面的例子中,您可以在调用nextImage之前和之后测试self._count的值,具体取决于对象的状态(_imagesInList和{})。更困难的地方是,如果您想测试nextImage确实使用正确的参数调用{},而对于您当前的设计,这样做的唯一方法就是为测试使用monkeypatch showImageByPath。测试showImageByPath将需要修补/模拟self.label.setPixmap()

正如其他人已经指出的那样,有一些mock/stub lib可以帮助解决所有可能的可测试性问题,您可能需要重新考虑您的设计以使事情变得更简单-例如不要在buildUI()中对QtGui.QLabel()的调用进行硬编码,而是有一些方法来“注入”所需的复合词(QtGui.QLabel()或一个mock)。一般来说,可测试代码具有很少的硬编码依赖项,很少有副作用,并且有很多小类使用短方法(而不是大类使用长方法)。在

相关问题 更多 >