2013-03-28 2 views
2

시뮬레이션에서 주어진 시간에 중단하고 일부 정보를 검색 한 다음 시뮬레이션을 계속 진행하는 데 필요한 장기 실행 시뮬레이션이 있습니다. 필자는 최근에 테스트 주도 디자인 (Design Driven Design) 방법을 사용하기 시작했습니다. 불행히도 대화 형 셸로 떨어지는 응용 프로그램을 단위 테스트하는 방법을 모릅니다. 여기 IPython 대화 형 쉘을 포함하는 Python 응용 프로그램의 단위 테스트를 작성하는 방법

는 내가 뭘하려고 오전의 기본 생각이다 :

# peekaboo.py 
from IPython import embed 
from IPython.config.loader import Config 

PAB_HEADER = 'Hello, my name is PAB. How may I help you?' 
PAB_EXIT_MESSAGE = 'Goodbye, sir.' 
PAB_PROMPT_IN_TEMPLATE = 'In [PAB \\#]: ' 
PAB_PROMPT_IN2_TEMPLATE = ' .\\D.: ' 
PAB_PROMPT_OUT_TEMPLATE = 'Out [PAB \\#]: ' 

def activate(**vars): 
    """ 
    Activate PAB 0.1 by starting an interactive shell and putting 
    the variables in the scope of the caller into the scope of this 
    method. 
    """ 
    # Add variables from caller to this scope 
    locals().update(vars) 
    cfg = None 
    try: 
     get_ipython 
    except NameError: 

     cfg = Config() 
     prompt_config = cfg.PromptManager 
     prompt_config.in_template = PAB_PROMPT_IN_TEMPLATE 
     prompt_config.in2_template = PAB_PROMPT_IN2_TEMPLATE 
     prompt_config.out_template = PAB_PROMPT_OUT_TEMPLATE 

    embed(config=cfg, header=PAB_HEADER, exit_msg=PAB_EXIT_MESSAGE) 

을 그리고 여기 peek_a_boo 모듈이 어떻게 사용되는지 그 예입니다

# long_running_app.py 
import peek_a_boo 
import datetime 
import random 

start_dt = datetime.datetime(2013,1,1) 
datetimes = [start_dt + datetime.timedelta(days=i) for i in range(10)] 
dt_of_interest = datetime.datetime(2013, 1, 8) 
def long_running_process(dts): 
    """ 
    simulate long running process 
    """ 
    some_data = {} 
    for dt in dts: 
     some_data[dt] = random.random() 
     if dt.date() == dt_of_interest.date(): 
      peek_a_boo.activate(**locals()) 

    return some_data 

if __name__ == '__main__': 
    data = long_running_process(datetimes) 
    print data 

나의 첫번째 성향은 모의 메서드를 사용하고 포함 메서드를 패치하고 올바른 인수로 호출되었는지 확인하지만 다른 제안이 있는지 궁금합니다.

UPDATE :

그래서 난 내 단위 테스트를 위해 코를 사용하고 난 다음 시도 :

# test_peek_a_boo.py 
import nose 
import mock 

class TestPeekABoo(object): 
    def setup(self): 
     pass 

    def teardown(self): 
     pass 

    @mock.patch('IPython.embed') 
    def test_activate(self, mock_embed): 
     """ 
     Test that the activate method calls IPython embed with the correct arguments 
     """ 
     import peek_a_boo 
     a = 'Hello' 
     b = 'World' 
     peek_a_boo.activate(**locals()) 
     mock_embed.assert_called_once_with(header=peek_a_boo.PAB_HEADER, ...) 

을하지만 실행하면

nosetests가

을 test_peek_a_boo.py

프로세스가 중단됩니다. 내가 실행하는 경우 :

nosetests를 test_peek_a_boo.py 내가 프로세스가 대화 형 쉘에 떨어지고 있음을 알 수

-s.

UPDATE 2 :

내가 테스트 클래스의 test_method 내부 peek_a_boo을 가져 와서 실행 위의 테스트를 얻을 수있었습니다.

이 테스트에서는 embed이 실제로 호출되었지만, a와 b가 모두 activate 메소드의 로컬 범위에 있는지 테스트 할 수 있기를 바랍니다.

답변

3

내가 작품을 생각해 낸 해결책 인 것처럼 보이므로 해결책으로 게시 할 것입니다.

# test_peek_a_boo.py 
import nose 
import mock 

class TestPeekABoo(object): 
    def setup(self): 
     pass 

    def teardown(self): 
     pass 

    @mock.patch('IPython.embed') 
    def test_activate(self, mock_embed): 
     """ 
     Test that the activate method calls IPython embed with the correct arguments 
     """ 
     import peek_a_boo 
     a = 'Hello' 
     b = 'World' 
     peek_a_boo.activate(**locals()) 
     mock_embed.assert_called_once_with(header=peek_a_boo.PAB_HEADER, ...)