嘲笑__main__

时间:2015-02-19 14:37:53

标签: python mocking unit-testing

我想确保测试: - 无法导入应用程序 - 应用程序可以作为一个真正的应用程序启动(即:python src.py)

我对此感兴趣,为什么以下不起作用:

src.py

class A:
 def x(self):
  print('this is x')

if __name__ == '__main__':
  A().x()

test.py(摘录)

class Test(unittest.TestCase):
  @mock.patch('src.A.x')
  def test_main(self, mock_x):
    import src
    mock_x.assert_any_call()

这个测试失败了......为什么?

2 个答案:

答案 0 :(得分:1)

因为导入时模块的名称是src,而不是__main__

最简单的解决方案是将该代码移动到一个函数中:

def main():
    A().x()

if __name__ == '__main__':
    main()

在测试中,您将调用src.main()

@mock.patch('src.A.x')
def test_main(self, mock_x):
    import src
    src.main()
    mock_x.assert_any_call()

答案 1 :(得分:0)

要测试模块是否无法导入,您不需要使用模拟。

请参阅assertRaises

只需检查导入od模块是否引发错误。

with self.assertRaises(...):
    ...