如何修补matplotlib图函数

时间:2020-05-24 20:19:43

标签: python matplotlib pytest

我正在做一个绘图函数的单元测试(使用pytest),该函数通过mplfiance(本质上是使用matplotlib的烛形图)调用plot方法。

我想在测试中设置对plot函数的调用,以便它不会实际创建图形。我只想在调用函数时查看参数是否正确。

例如

def plot_something(param1, param2):
    # doing something with param1 and para2
    param1 += 1
    param2 *= 2
    # below is the actual plotting where I would like to patch
    make_plot(param1, param2)

def make_plot(param1, param2):
    # make plot here
    plot(param1, param2)

如何创建一个测试用例,以确保1)plot_something()和make_plot()都被调用。 2)声明了参数3)屏幕上没有实际显示任何图形?

我想打补丁是用测试函数中的内容替换make_plot()调用的方法。但是我不知道到底是怎么回事。

非常感谢您的建议。

1 个答案:

答案 0 :(得分:1)

这让我好奇地自己测试模拟模块。这是我的代码,似乎工作正常:

from unittest import TestCase, main
from unittest.mock import Mock
import pylab

def plot_something():
    x = [1,2,3]
    y = [3,1,2]
    pylab.plot(x, y, "o-")
    pylab.show()


class TestPlot(TestCase):
    def test_plot_something(self):
        # save the original methods for later use (if required)
        pyplot, pyshow = pylab.plot, pylab.show

        pylab.plot, pylab.show = Mock(), Mock()
        plot_something()

        pylab.plot.assert_called_once_with([1,2,3], [3,1,2], "o-")
        pylab.show.assert_called_once_with()

        # restore the original ones again
        pylab.plot, pylab.show = pyplot, pyshow

    def test_plot_again_but_plot_really(self):
        # this actually plots
        plot_something()


if __name__ == "__main__":
    main()

因此,在这里我什至修补了pylab方法。当然,在更高级别上进行干预更加容易(无论是否调用plot_someting)。