3

ソフトウェア プロジェクトのさまざまな側面をテストするために、モック ライブラリと unittest2 を使用しています。

現時点では、次の質問があります。デフォルトのキーワード引数が異なるように関数をモックすることは可能ですが、機能は維持されますか?

次のコードがあるとします

class C():
  def fun(self, bool_arg = True):
    if bool_arg:
      return True
    else
      return False

C.fun をモックしたい場合:

C.fun = mock.Mock(???)

そのため、C のすべてのインスタンスは、キーワード 'bool_arg' を True と次の結果ではなく False に置き換えます。

c = C()
c.fun()

戻り値:

間違い

4

2 に答える 2

3

関数をラップすることもできます。ライン上の何か

def wrapper(func, bool_arg):
    def inner(*args, **kwargs):
        kwargs['bool_arg']=bool_arg
        return func(*args, **kwargs)
    return inner

class C():
    def fun(...):
        ...

c = C()
c.fun = wrapper(fun, False)

動作するはずです

編集

特定のインスタンスではなくクラスのデフォルトを変更したい場合は、派生クラスを作成しfun、 のメソッドのラッピングを再定義できますC。何かが進行中です(テストする時間がありません):

class D(C):
    def fun(self, *args, **kwargs):
        f = wrapper(C.f, False)
        return f(*args, **kwargs)

次に、@Ber の提案について、定義してから実行する代わりdef wrapper(func, **wrapkwargs)kwargs['bool_arg']=bool_arg

for i in wrapkwargs.iteritems():  #wrapkwargs is a dictionary
    kwargs[i[0]] = i[1]
于 2013-01-30T14:20:21.293 に答える
2

このコードを試すことができます:

>>> import mock
>>> 
>>> class C():
...   def fun(self, bool_arg = True):
...     if bool_arg:
...       print "True"
...     else:
...       print "False"
... 
>>> c = C()
>>> funCopy = c.fun
>>> c.fun = mock.Mock(side_effect=lambda bool_arg=False: funCopy(bool_arg=bool_arg))
>>> c.fun()
False

お役に立てれば

于 2013-01-30T13:53:55.453 に答える