2016-07-14 31 views
1

比方说,我想确保某些标志等得到适当的调度,使之内我的图书馆深,特定的功能被称为:Python的单元测试和模拟:检查如果一个函数被调用,但随后停止测试

high_order_function_call(**kwargs) 深内包含library_function_call() 我想确保它实际上被调用。

此给出的典型例子使用mock.patch

@mock.patch('library') 
def test_that_stuff_gets_called(self, mock_library): 
    high_order_function_call(some_example_keyword='foo') 
    mock_library.library_function_call.assert_called_with(42) 

现在,在这种情况下,我必须等待所有的东西在high_order_function_call整个执行。如果我想要执行停止并在达到mock_library.library_function_call时立即跳回我的单元测试?

回答

1

您可以尝试在调用中使用异常提升副作用,然后在测试中捕获该异常。

from mock import Mock, patch 
import os.path 

class CallException(Exception): 
    pass 

m = Mock(side_effect=CallException('Function called!')) 
def caller_test(): 
    os.path.curdir() 
    raise RuntimeError("This should not be called!") 

@patch("os.path.curdir", m) 
def test_called(): 
    try: 
     os.path.curdir() 
    except CallException: 
     print "Called!" 
     return 
    assert "Exception not called!" 

if __name__ == "__main__": 
    test_called() 
+0

这不是一个坏主意。我已经实现了它,它确实有效。我会稍微等一下,看看是否会有解决方案,但感觉不那么hacky?我只是想知道是否有一种更直接的方式来告诉模拟和/或单元测试,只要满足一些条件就立即停止执行。无论如何,谢谢你的回答! – Lagerbaer

+0

是的,有点惊讶的是,图书馆中没有更好的语法版本。我最好的猜测是模拟可以让所有事情都默认运行,所以多次测试可以在一次传递中发生? – qDot

相关问题