2017-08-12 4 views
1

Je suis en train d'écrire un cas de unittest pour la méthode ci-dessous dans mon main.pyComment écrire cas de test unitaire pour cette senario

def create_tmp_dir(tmp_dir): 
    logger.info('{app} Creating directory: {arg}'.format(
     app=app_log, arg=tmp_dir)) 
    mkdir_cmd = 'mkdir -p ' + tmp_dir 
    try: 
     utility.simple_cmd(mkdir_cmd) 
    except Exception, exc: 
     logger.critical('{app} Unable to create dir: {arg}'.format(app=app_log, arg=exc)) 
     exit(1) 

la méthode simple_cmd en utility.py fait:

def simple_cmd(cmd): 
    subprocess.call(cmd, shell=True, stdout=subprocess.PIPE) 

ceci est mon test_main.py

def test_create_tmp_dir_raises_exception_on_blank_dir(): 
    with patch('utility.simple_cmd'): 
     with pytest.raises(Exception): 
      main.create_tmp_dir('') 

quand je lance pytest, il dit exception ne se pose pas

 with patch('utility.simple_cmd'): 
      with pytest.raises(Exception): 
>    main.create_tmp_dir('') 
E    Failed: DID NOT RAISE <type 'exceptions.Exception'> 

Répondre

0

@phd Merci pour votre réponse, en fait je ne peux pas changer le code source. Donc la solution que j'ai trouvée est que je devrais mettre side_effect à Exception et élever un SystemExit.

def test_create_tmp_dir_exits_on_exception(): 
    with patch('utility.simple_cmd') as SimpleCmdMock: 
     SimpleCmdMock.side_effect = Exception 
     with pytest.raises(SystemExit): 
      assert main.create_tmp_dir('Some_Directory') is None 
1

create_tmp_dir ne soulève pas Exception - il l'attrape et se transforme en SystemExit qui est une sous-classe de BaseException, non Exception, d'où votre pytest.raises(Exception) ne l'attrape pas.

Reraise l'exception au lieu de sortir:

except Exception, exc: 
    logger.critical('{app} Unable to create dir: {arg}'.format(app=app_log, arg=exc)) 
    raise 
+0

Merci pour votre réponse. –