【发布时间】:2018-12-27 23:51:19
【问题描述】:
我想断言 matplotlib.pyplot.show 是在我的班级的一个方法中调用的,但我不希望该方法在单元测试期间实际调用 show() 并在外部窗口上绘图。无论我如何尝试模拟 matplotlib,它似乎都不起作用。我将在下面列出我的代码的重要部分:
#In Model Test Class:
import Model
import matplotlib
import unittest
from unittest.mock import patch
class Model_Test(unittest.TestCase):
@patch('matplotlib.pyplot')
def test_plot_data(self, mock_pyplot):
model = Model()
model.plot_data()
mock_pyplot.show.assert_called_once()
#In Model Class:
import matplotlib.pyplot as plt
import pandas as pd
class Model(object):
... # (__init__ and other methods)
def plot_data(self):
self.dataframe.plot(y=self.dataframe.columns, subplots=False, figsize=(15, 8), fontsize=12)
plt.title('Data for Model Version: ' + self.version, fontsize=20)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('value', fontsize=12)
plt.show()
我还尝试为 mock_plot.show 设置返回值。当我使用调试器时,模型类中的 matplotlib 不会通过 Mock 对象传播,所以我不确定如何模拟 matplotlib 模块或其成员函数。是否可以模拟 matplotlib?
关于如何在单元测试中正确模拟 matplotlib(主要是为了防止显示绘图)有什么想法吗?
编辑:我可以通过将补丁装饰更改为
@patch('matplotlib.pyplot.show'),
但我仍然不确定为什么这会奏效,而我之前的尝试却没有。
【问题讨论】:
标签: python unit-testing matplotlib mocking python-unittest