2013-10-01 50 views
8

私は与えられた入力に基づいて特定の値を返すようにしようとしています。私はSOのいくつかの例を調べました。何らかの理由で私はまだそれを動作させることができません。ここに私が今持っているものがあります。side_effectを使ったPythonパッチオブジェクト

class EmailChecker(): 
    def is_email_correct(email): 
     some regex to determine if email is valid, returns either True or False 

def my_side_effect(**args): 
    if args[0] == '1': 
     return True 
    else: 
     return False 

myMock = mock.patch.object(EmailChecker, 'is_email_correct', side_effect=my_side_effect) 

ただし、動作していないようです。私はここで何が欠けていますか?

+0

'func'は何? – falsetru

+0

'* args'の代わりに' ** args'を使う理由は? – falsetru

+0

'** args'はキーワード引数をチェックし、' * args'は位置引数をチェックします。ですから、@ falsetruに言及すると、おそらく '* args'が必要になります。 –

答えて

13

次のコードのように、デコレータまたはコンテキストマネージャとして使用patch.object

>>> class EmailChecker(): 
...  def is_email_correct(self, email): 
...   pass 
... 
>>> def my_side_effect(*args): 
...  if args[0] == '1': 
...   return True 
...  else: 
...   return False 
... 
>>> with mock.patch.object(EmailChecker, 'is_email_correct', side_effect=my_side_effect): 
...  checker = EmailChecker() 
...  print(checker.is_email_correct('1')) 
...  print(checker.is_email_correct('2')) 
... 
True 
False 

は:*args**args置き換え。 is_email_correctメソッドに引数がないので、selfが追加されました。次のように


my_side_effectを簡略化することができます

def my_side_effect(email): 
    return email == '1' 
+0

私は事故で** argsを使用しているに違いありません。素晴らしい仕事を!ありがとう! –

+0

@congalong、私は 'my_side_effect'についてのメモを追加しました。見てみな。 – falsetru

+1

通常、my_side_effect関数内の元の呼び出しにある「self」パラメータを取得する方法はありますか? –

関連する問題