3 Stimmen

Mock Y von (from X import Y) in doctest (python)

Ich versuche, einen Doctest mit mock der Funktion, die in einem separaten Modul befindet erstellen und das wie folgt importiert wird

from foomodule import foo

def bar():
    """
    >>> from minimock import mock
    >>> mock('foo', nsdicts=(bar.func_globals,), returns=5)
    >>> bar()
    Called foo()
    10
    """
    return foo() * 2

import doctest
doctest.testmod()

foomodule.py:

def foo():
    raise ValueError, "Don't call me during testing!"

Dies schlägt fehl.

Wenn ich den Import auf foomodule importieren und verwenden foomodule.foo überall Dann funktioniert es.

Aber gibt es eine Lösung für Mocking-Funktion importiert die Art und Weise oben?

4voto

Alex Martelli Punkte 805329

Sie haben soeben einen der vielen Gründe kennengelernt, die es ratsam erscheinen lassen, niemals Objekte "innerhalb" von Modulen zu importieren - nur Module selbst (möglicherweise innerhalb von Paketen). Wir haben diese Regel zu einem Teil unserer Stilrichtlinien bei Google gemacht (veröffentlicht aquí ) und ich kann es jedem Python-Programmierer nur wärmstens empfehlen.

Das heißt, was Sie tun müssen, ist, die foomodule.foo, die Sie gerade durch ein Mock ersetzt haben, in das aktuelle Modul zu stecken. Ich erinnere mich nicht an genug von doctest's internal, um zu bestätigen, ob

   >>> import foomodule
   >>> foo = foomodule.foo

reicht dafür aus - probieren Sie es aus, und wenn es nicht klappt, machen Sie stattdessen

   >>> import foomodule
   >>> import sys
   >>> sys.modules[__name__].foo = foomodule.foo

Ja, es ist ein Chaos, aber die Ursache für dieses Chaos ist diese unschuldig aussehende from foomodule import foo -- Vermeiden Sie das, und Ihr Leben wird einfacher und produktiver sein;-).

2voto

Evgenyt Punkte 9413

Schließlich fand ich heraus, dass dies eher ein Problem der Trunk-Version von MiniMock war. Alte stabile ein führt wie erwartet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X