Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python unittest库中模拟对对象方法的非调用_Python_Unit Testing_Python Unittest - Fatal编程技术网

如何在Python unittest库中模拟对对象方法的非调用

如何在Python unittest库中模拟对对象方法的非调用,python,unit-testing,python-unittest,Python,Unit Testing,Python Unittest,我有一个非常有用的python方法,如下所示: def stop_widget(): original_widget = load_widget_from_file() if original_widget: original_widget.close() 当我想测试它以确保调用了close(),我会: @patch('load_widget_from_file') def test_stop_widget_with_original_widget(self, lwff_mo

我有一个非常有用的python方法,如下所示:

def stop_widget():
  original_widget = load_widget_from_file()
  if original_widget: 
    original_widget.close()
当我想测试它以确保调用了
close()
,我会:

@patch('load_widget_from_file')
def test_stop_widget_with_original_widget(self, lwff_mock):
    mock_widget = create_autospec(Widget)
    lwff_mock.return_value = mock_widget
    stop_widget()
    mock_widget.close.assert_called_once_with()
但是当
load\u widget\u from\u file
的返回值未计算为True时,如果我想测试不调用
close
,该怎么办

如果我尝试使用以下工具进行另一个单元测试:

@patch('load_widget_from_file')
def test_stop_widget_with_original_widget(self, lwff_mock):
    mock_widget = None
    lwff_mock.return_value = mock_widget
    stop_widget()
    mock_widget.close.assert_not_called()

这会爆炸的

您需要创建第二个模拟对象(而不是设置
mock\u widget=None
),但该小部件需要为false,以防止函数进入if条件

在Python中,对象总是“真实的”,除非它的长度为零,或者它有:

对象。\uuuu bool\uuuuu(自)

调用以实现真值测试和内置操作
bool()
;应返回
False
True
。未定义此方法时,如果已定义,则调用
\uuuu len\uuuu()
,如果结果为非零,则认为该对象为真。如果一个类既不定义
\uu len\uuuuuuuuuu()
也不定义
\uuuuuuu bool\uuuuuuuuuu()
,那么它的所有实例都被认为是真的

向模拟对象添加
\uuubool\uuu
方法的“正确方法”可能是to,这是许多Python“魔术方法”预定义的方法。但您还必须将返回值更改为
False
,如下所示:

@patch('load_widget_from_file')
def test_stop_widget_with_original_widget(self, lwff_mock):
    mock_widget = MagicMock()
    mock_widget.__bool__.return_value = False
    lwff_mock.return_value = mock_widget
    stop_widget()
    mock_widget.close.assert_not_called()

关于
assert\u not\u called
?larsks,我没有一个对象实例化了一个函数来调用它。如果你在第二个方法中执行
mock\u widget=create\u autospec(widget)
,就像在第一个方法中一样?@rick,这会失败,因为调用了close(这将使它与第一个情况相同)是的,第一种方法不起作用-bool没有在原始类中定义,因此我认为create_autospec没有进入并使其成为(至少不是我运行的Python 3.5.1版本,我查看了unittest框架的一些变更日志,看起来很久以前有人为bool实现了一些magicmethod,但我没有看到它的文档。是的,我没有费心测试。删除了第一个想法-不确定为什么它不起作用,但不管怎样。我尝试了你提到的方法但是对于Python3.6,上面的解决方案不起作用。更改了代码lwff\u mock.return\u value.\uuuu bool\uuuu.return\u value=False,它就起作用了。