2014-02-05 4 views
12

은 이제 나는 다음과 같은 간단한 고정 있다고 가정 해 봅시다 (사용 pytest-장고를,하지만 난 그것뿐만 아니라 pytest 적용해야한다고 생각) :여러 복사본

@pytest.fixture 
def my_thing(request, db): 
    thing = MyModel.objects.create() 
    request.addfinalizer(lambda: thing.delete()) 
    return thing 

이 때 좋은 작품 내 테스트에는 MyModel의 단일 인스턴스가 필요합니다. 그러나 두 개 (또는 세 개 또는 네 개)가 필요한 경우는 어떨까요? 나는 각 인스턴스가 구별 되길 원하지만 같은 방식으로 설정되기를 바란다.

코드를 복사/붙여 넣기하고 조명기 기능의 이름을 바꿀 수는 있지만 그다지 좋지 않습니다.

마찬가지로, 나는 시도했다 :

@pytest.fixture 
def my_thing_1(my_thing): 
    return my_thing 

@pytest.fixture 
def my_thing_2(my_thing): 
    return my_thing 

그러나이 나타납니다 각각 MyModel의 동일한 인스턴스를 반환 할 수 있습니다.

pytest의 기본 기능을 사용하여 원하는 것을 할 수 있습니까? 대안으로, 나는 너무 많은 코드를 복제하지 않기 위해 도우미 함수의 셋업/분해를 헬퍼 함수로 옮길 수있다.

아니면이 모든 일을 잘못된 방식으로 진행하고 있습니까?

답변

17

아마 당신의 객체를 생성 할 수있는기구를 만드는 것이 나의 접근 방식은 :

분명히
@pytest.fixture 
def thing(request, db): 
    class ThingFactory(object): 
     def get(self): 
      thing = MyModel.objects.create() 
      request.addfinalizer(thing.delete) 
      return thing 
    return ThingFactory() 

def test_thing(thing): 
    thing1 = thing.get() 
    thing2 = thing.get() 

당신은 .get()이 인수를 등

(PS를 만들 수 있습니다 또한 람다에 대한 필요가 없습니다주의 파이널 라이저에서)

+1

1) 종료 자에 람다를 필요로하지에 좋은 전화를받을. 2) 나는 당신의 접근 방식을 좋아합니다. 저는 실제로 Factory Boy를 사용하여이 모델들을 제작하고 있습니다. 그래서 나는 각 모델에 대한 공장 치구를 만들 필요조차 없다고 생각합니다. 하지만 SubFactory에 finalizer를 재귀 적으로 추가하기 위해 ModelFactory를 서브 클래 싱하는 데 문제가있어 문제 해결의 길잡이로 활용할 것입니다. 감사! –

+1

나중에 finalizer를 사용하는 유일한 이유는 pytest-django가 여러 데이터베이스를 지원하지 않기 때문에 테스트 사이에 데이터베이스를 정리하지 않았기 때문입니다 (https://github.com/pelme/pytest_django/issues/ 참조). 76). 위에서 설명한 유형의 문제에 대해서는 전적으로 FactoryBoy를 pytest-django와 함께 사용하는 것이 좋습니다. –

0

나는이 질문에 매우 늦게 도착했다. 그러나 매개 변수화 된 조명기를 사용하여 복제하려는 조명기를 반환하는 것 또한 효과가있는 것처럼 보인다. 위의 검사를 실행할 경우

import pytest 
import random 

@pytest.fixture 
def name(): 
    return random.randint(0, 10) 


@pytest.fixture(params=[0, 1]) 
def parametrized_name(request, name): 
    return name 


def test_something(parametrized_name): 
    print "Testing with name: " + str(parametrized_name) 

, 당신은 2 개의 다른 "이름"설비

$ pytest -s blah.py 
============================================= test session starts ============================================== 
platform linux2 -- Python 2.7.14, pytest-3.3.2, py-1.5.2, pluggy-0.6.0 
rootdir: /home/bsquizza/repos/blah/tests, inifile: 
collected 2 items                        

blah.py Testing with name: 7 
.Testing with name: 10 
.                        [100%] 

=========================================== 2 passed in 0.01 seconds =========================================== 
관련 문제