2

initメソッドによって呼び出されるクラス内の単一のメソッドをスタブ化したいと考えています。

class MyClass(object):
  def __init__(self): 
    # Some initializer code here
    ...
    self.method_with_side_effects()

  def method_with_side_effects(self):
    ... # Load files, etc.

Mox のドキュメントによると、オブジェクトをインスタンス化してから StubOutWithMock メソッドを使用することで、メソッドをモックできます。しかし、この場合、私はそれを行うことはできません:

import mox
m = mox.Mox()
myobj = MyClass()
m.StubOutWithMock(myobj, "method_with_side_effects") # Too late!

そのメソッドをスタブする他の方法はありますか?

4

2 に答える 2

3

直接サブクラス化MyClassしてオーバーライドできますmethod_with_side_effectsか?

于 2011-06-22T15:07:13.893 に答える
1

メソッドをスタブ化するだけの場合は、stubout モジュールを使用できます。

import stubout

s = stubout.StubOutForTesting()
s.Set(MyClass, 'method_with_side_effects', lambda self: None)

実際にメソッドをモックしたい場合は、より複雑になります。__new__()からの副作用を回避するためにインスタンス オブジェクトを直接作成し、__init__()それを使用して予想される動作を記録できます。

import mox

m = mox.Mox()
m.StubOutWithMock(MyClass, 'method_with_side_effects')

instance = MyClass.__new__(MyClass)
instance.method_with_side_effects().AndReturn(None)

m.ReplayAll()
MyClass()
m.VerifyAll()

実際に動作の検証が必要ない場合は、モックの代わりにスタブを使用する方がはるかに脆弱ではありません。

于 2011-07-28T15:54:06.600 に答える