2013-04-17 2 views
11

初めてパッチを使用しています。私はテストのために自分のクラスを修正しようとしました。パッチなしで実行しようとすると、テスト関数定義を過ぎて取得しますが、パッチをテスト関数の定義は明らかに別のパラメータを必要とし、私はパッチ - クラスにパッチを適用すると余分なパラメータが導入されますか?

TypeError: testAddChannelWithNamePutsChannel() takes exactly 1 argument (2 given) 

エラーを取得します。テストコードは、次のとおりです。

import unittest 
import mock 
from notification.models import Channel, addChannelWithName, deleteChannelWithName 

class TestChannel(unittest.TestCase): 
    @mock.patch('notification.models.Channel') 
    def testAddChannelWithNamePutsChannel(self): 
     addChannelWithName('channel1') 
     Channel.put.assert_called_with() 

なぜこのパラメータを追加する必要がありますか?大変ありがとう!

+2

'self'の代わりに' self、* args'を使い、 'args'を出力してみてください。 –

答えて

6

patchは、テストされたオブジェクトをテスト関数に渡します。その文書化here:関数デコレータとして

パッチ、あなたのためのモックを作成し、装飾された関数に 渡す:

>>> 
>>> @patch('__main__.SomeClass') 
... def function(normal_argument, mock_class): 
...  print(mock_class is SomeClass) 
... 
>>> function(None) 
True 
23

パッチがテストにパッチを適用したオブジェクトのインスタンスを渡しメソッド(またはクラスレベルでパッチを当てている場合はすべてのテストメソッド)に渡します。それはあなただけ、あなたが次の呼び出しでパッチを呼び出すことができ、文字通りそれを無視して何かをパッチを適用したい場合は、

@patch('some_module.sys.stdout') 
def test_something_with_a_patch(self, mock_sys_stdout): 
    mock_sys_stdout.return_value = 'My return value from stdout' 

    my_function_under_test() 

    self.assertTrue(mock_sys_stdout.called) 
    self.assertEqual(output, mock_sys_stdout.return_value) 

を作ったの呼び出しを戻り値と副作用を設定、またはチェックすることができますので、これは便利です

@patch('some_module.sys.stdout', Mock()) 
def test_something_with_a_patch(self): 

some_moduleのsys.stdoutをmockオブジェクトに置き換え、メソッドに渡しません。

関連する問題