1

datetime.now()いくつかのロジックをテストするための結果を置き換えるために、モックライブラリを使用したいと思います。だから私は今使っていてmocker、それはうまくいきます、しかし私はいくつかの問題、おそらくバグを持っていたので、私はもっと更新されたものに移りたいです。グーグルはそう使うことを提案しますfudge...私はそれをあざけることができませんdatetime.now()

from one import ClassName
def test_fudge():
    import fudge

    @fudge.patch('datetime.datetime.now')
    def a(dtn):
        dtn.expects_call().returns(1)
        print 'fudge:', 'yep' if ClassName().one() == 1 else 'nope'
    a()
test_fudge()

one.pyファイル:

from datetime import datetime, timedelta
class ClassName(object):
    def one(self):
        return datetime.now()

結果:fudge: nope

何か案は?

モッカーの例

import mocker
from one import ClassName
m = mocker.Mocker()
n = m.replace('datetime.datetime')
n.now()
m.result(123)
with m:
    print ClassName().one()

one.pyは同じです。結果:123

4

1 に答える 1

3

datetimeこれは、モジュールをone.pyにインポートした方法によるものです。代わりに、これを試してください:

import datetime
class ClassName(object):
    def one(self):
        return datetime.datetime.now()

これは、Pythonのインポートが機能する方法が原因で発生する問題です。などの別のモックライブラリを使用した場合も、同じ問題が発生しますmock

説明しようとしますが、StackOverflowのどこかにもっと良い答えがあり、私が求めていたものを見つけることができませんでした。

from datetime import datetimeを使用すると、パッケージdatetimeがインポートされ、datetime.datetimeクラス参照がone.pyのローカルスコープにバインドされます。

ただし、fudgeがオーバーライドするために付けられた名前は、 one.pydatetime.datetime.now()のローカルバインディングとは異なる名前であるため、パッチは適用されません。

言い換えると、test_fudge()実行時に名前にパッチを適用しようとしているときに、 one.pyの名前が実行時と同じオブジェクトを参照しdatetime.datetime.nowていることをどのようにして知ることができますか?datetimedatetime.datetime

于 2013-01-22T12:33:35.883 に答える