2016-12-13 6 views
0

Ich verwende die waiting Bibliothek in meinem Code, um auf eine Bedingung zu warten, um wahr zu werden. Als Teil der Bibliothek gibt waiting.waitTrue zurück, wenn das Prädikat wahr ist; andernfalls wirft es und Ausnahme oder wartet für immer abhängig von Timeout-Werten usw.Wie kann ich warten, Bibliothek in Python?

Ich möchte dieses in meinen Tests patch, um immer True zurückzugeben, ohne in den Wartezyklus zu kommen. Hier ist mein Versuch:

#!/usr/bin/env python3 

from unittest.mock import Mock 
import waiting 
from waiting import wait 

def test_waiting(): 
    waiting.wait.return_value = True 
    # Below *should* wait forever because it can never be true. 
    # Want to make it return true instead. 
    return wait(lambda: False) 

if __name__ == "__main__": 
    assert(test_waiting()) 

Was finde ich aber, dass es tatsächlich der Bibliothek Code ruft statt Kurzschließen der Rückkehr.

Wie kann ich diese Methode zwingen, einfach einen Wert zurückzugeben (oder einen Nebeneffekt auszulösen), ohne den Code tatsächlich aufzurufen?

Antwort

1

Ihr waiting.wait.return_value = True wird nicht funktionieren, weil waiting.wait kein Mock-Objekt ist. Sie haben der vorhandenen Funktion wait nur ein beliebiges Attribut hinzugefügt, aber diese Funktion wird dieses Attribut nicht verwenden.

Um die wait Funktion zu verspotten, es nur verspotten direkt:

from unittest import mock 

with mock.patch('__main__.wait'): 
    wait.return_value = True 

Es besteht keine Notwendigkeit, die Interna der waiting Bibliothek zu verspotten, alles, was Sie in Ihrem Code passieren soll, ist, dass jeder Einsatz der wait() sofort abrufbar zurückgibt.

Bitte beachte, dass ich das __main__ Modul nahm den Namen wait() in, Patch Where to patch in der unittest.mock Dokumentation.

Ihr tatsächlicher Standort kann abweichen, und wenn Sie import waiting überall verwendet haben, müssen Sie mock.patch('waiting.wait') verwenden. Ansonsten würden Sie es in der Regel das gleiche Modul verwenden Sie from waiting import wait in.

+0

Nun, das war dumm von mir. :) Funktioniert perfekt. Prost! – erip

Verwandte Themen