2016-09-12 8 views
1

하나의 테스트에서 pytest yield-fixture을 기본 범위로 여러 번 사용하려고합니다.Python. Pytest fixture coll

@pytest.fixture 
def create_temp_file(): 
    nonlocal_maker_data = {'path': None} # nonlocal for python2 

    def maker(path, data): 
     nonlocal_maker_data['path'] = path 
     with open(path, 'wb') as out: 
      out.write(data) 
    try: 
     yield maker 
    finally: 
     path = nonlocal_maker_data['path'] 
     if os.path.exists(path): 
      os.remove(path) 


def test_two_call_of_fixture(create_temp_file): 
    create_temp_file('temp_file_1', data='data1') 
    create_temp_file('temp_file_2', data='data2') 

    with open('temp_file_1') as f: 
     assert f.read() == 'data1' 

    with open('temp_file_2') as f: 
     assert f.read() == 'data2' 

    assert False 
    # temp_file_2 removed 
    # temp_file_1 doesn't removed 

충돌이 있습니다. 첫 번째 조명기는 청소하지 않습니다. temp_file_1은 제거되지 않지만 두 번째 파일은 잘 제거됩니다. 조명기를 여러 번 사용할 수 있습니까?

추신 : 저는 tmpdir에 대해 알고 있습니다 - 정상적인 테스트 도구. 이것은 단지 예일뿐입니다.

+0

물론이 예제에서는 생성 된 모든 파일을 비 로컬 목록에 누적하여 제거 할 수 있습니다. 하지만 가장 일반적인 방법을 이해하고 싶습니다. –

답변

0

조명기는이 예제의 기능을 수행합니다. 정규식은 전달 된 인수를 누적하는 것이라고 생각합니다.

@pytest.fixture 
def create_temp_file(): 
    nonlocal_maker_data = set() # nonlocal for python2 

    def maker(path, data): 
     with open(path, 'wb') as out: 
      out.write(data) 
     nonlocal_maker_data.add(path) 
    try: 
     yield maker 
    finally: 
     for path in nonlocal_maker_data: 
      if os.path.exists(path): 
       os.remove(path)