2017-08-28 1 views
0

J'utilise pytest avec certains appareils compliqués à injection de dépendances. J'ai des appareils qui utilisent d'autres appareils dans une longue chaîne. J'aimerais pouvoir modifier certains appareils au milieu de la chaîne pour des tests spécifiques.Surclassement de sous-agencements dans pytest

Compte tenu de ces (simplifié) accessoires:

@pytest.fixture 
def cache(): 
    return Cache() 

# Use cache fixture in a new fixture. 
@pytest.fixture 
def resource(cache): 
    return Resource(cache=cache, working=True) 

# Use resource fixture in a new fixture. 
@pytest.fixture 
def service(resource): 
    return Service(resource=resource) 

Et quelques tests:

def test_service_when_resource_working(service): 
    assert service.status == "good" 

def test_service_when_resource_broken(service): 
    assert service.status == "bad" 

Comment puis-je remplacer l'appareil resource de sorte qu'il est comme ça:

@pytest.fixture 
def broken_resource(cache): 
    return Resource(cache=cache, working=False) 

. ..mais seulement pour le cas de test test_service_when_resource_broken? Je peux créer un broken_service qui utilise broken_resource, mais la réalité est que la chaîne de dépendance est longue, et je veux réutiliser tous les appareils, mais en modifier sélectivement certains au milieu pour les tests sélectionnés.

Je veux faire quelque chose comme ça (pseudo-code):

@pytest.override_fixture('resource', 'broken_resource') 
def test_service_when_resource_broken(service): 
    # service should have been instantiated with broken_resource instead of resource. 
    assert service.status == "bad" 

Répondre

2

Vous pouvez utiliser markers sur vos tests pour obtenir ce que vous attendez. Fondamentalement, vous marquez le test pour lequel vous avez besoin d'un comportement différent. Dans la méthode fixture, recherchez ce marqueur dans le contexte et le processus du test demandeur.

Voici comment vous pouvez le faire.

@pytest.fixture 
def cache(): 
    return Cache() 

# Use cache fixture in a new fixture. 


@pytest.fixture 
def resource(request, cache): 
    working = True 
    marker = request.node.get_marker("broken") 
    if marker: 
     working = False 

    return Resource(cache=cache, working=working) 


# Use resource fixture in a new fixture. 
@pytest.fixture 
def service(resource): 
    return Service(resource=resource) 


def test_service_when_resource_working(service): 
    assert service.status == "good" 


@pytest.mark.broken 
def test_service_when_resource_broken(service): 
    assert service.status == "bad" 
+0

Parfait. Merci! –

+0

Heureux, ça a aidé, pourriez-vous s'il vous plaît marquer la réponse comme acceptée. – Sanju