2013-01-22 38 views
1

我想用模擬庫來替換datetime.now()的結果來測試一些邏輯。所以我現在使用mocker,它工作的很好,但是我遇到了一些問題,或許是bug,所以我想繼續更新。谷歌建議使用fudge所以......我不能讓他嘲笑datetime.now()Fudge mocking 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

回答

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局部範圍的約束。

然而,軟糖已被賦予的名稱是datetime.datetime.now(),與one.py上的本地綁定名稱不同,因此不會發生修補。

換句話說,當test_fudge()運行,並正在尋求修補名datetime.datetime.now,它是如何知道的datetimeone.py指的是同一個對象datetime.datetime在運行時?

+0

謝謝,但類似的代碼與'mocker'完美配合。也許有些骯髒的魔法我稍後會嘗試這個想法,我很抱歉。 – dt0xff

+0

有趣。你可以請添加一個適用於你的問題比較的例子。 –

+0

加入問題主體。 – dt0xff