3

別のモジュールに存在し、次のようにインポートされる関数のモックを使用して doctest を作成しようとしています

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!"

これは失敗します。

import をimport foomoduleに変更し、どこでもfoomodule.foo を使用すると、機能します。

しかし、上記の方法でインポートされた関数をモックするための解決策はありますか?

4

2 に答える 2

4

「内部」モジュールからオブジェクトをインポートしないことが最善である多くの理由の1つに遭遇しました。モジュール自体のみ(おそらくパッケージ内から)です。このルールをGoogleのスタイルガイドライン(ここで公開)の一部にしたので、すべてのPythonプログラマーに心からお勧めします。

そうは言っても、あなたがする必要があるのは、あなたがモックに置き換えたばかりのfoomodule.fooを取り、それを現在のモジュールに貼り付けることです。doctestの内部を十分に思い出せないので、

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

そのためには十分です-試してみてください。うまくいかない場合は、代わりに実行してください

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

ええ、それは混乱ですが、その混乱の原因は、その無邪気な見た目ですfrom foomodule import foo-それを避ければ、あなたの人生はよりシンプルで生産的になります;-)。

于 2010-02-07T17:16:19.567 に答える
2

最後に、これはむしろ MiniMock のトランク バージョンの問題であることがわかりました。古い安定版は期待どおりに機能します。

于 2010-02-07T18:02:00.627 に答える