2012-01-21 9 views
2

私はMock 0.7.2でPython 2.6.5を使用しており、クラスにパッチデコレータを使用するユニットテストを行っています。パッチを付けてurllib2でモックを初期化する

@patch('urllib2.Request') 
def test_do_my_call(self, MockClass): 

    """will test that _do_my_call is getting called with correct values""" 

    instance = MockClass.return_value 
    mock_urlopen = Mock() 
    mock_urlopen.return_value = 'foo' 
    urllib2.urlopen = mock_urlopen 

    response = do_something('MyData') 

    self.assertEqual(mock_urlopen.call_count, 1) 
    self.assertEqual(response, 'foo') 

上記のコードは合格し、少なくともurlopenが呼び出されたことを確認しますが、まだ弱いです。

"do_something"メソッドは新しいリクエスト(したがってパッチの必要性)を作成し、urlopenを呼び出します(上記のように、呼び出されることを確認します)。しかし、私は、 "do_something"内からurllib2.Request()に渡されたパラメータをテストする方法があるかどうか疑問に思っていました。たとえば、do_somethingが正しい/予想されるURLと正しい/予期されたヘッダーを渡しましたか?

これは可能ですか?

答えて

1

私はgrncdrに同意するが、あなたのクラスは副作用があった場合は、ここにあなたがそれを行うことができ方法は次のとおりです、うまく

from mock import Mock, patch 

class MyClass(object): 
    def __init__(self, a, b, c): 
     pass 

def method_to_test(): 
    m = MyClass(1, 'test', {'key' : 'value'}) 

@patch('__main__.MyClass') 
def test_my_method(mock_class): 
    method_to_test() 
    mock_class.assert_called_with(1, 'test', {'key': 'value'}) 

test_my_method() 
+0

うん... grncdrは非常に良い点を作っています。しかし、私は答えとしてこれを選択しています。誰かを助けるかもしれないからです。私が間違っていたのは、 "インスタンス"をテストしようとしていたことでした。 "MockClass"でそれをやっていたはずです。ありがとう! –

3

Requestインスタンスを作成すると、副作用を持っていないので、あなたはurllib2.Requestをからかっが、その代わりに、それは正しい状態を持っていることを確認するために、あなたの嘲笑urlopenに渡される本当Requestインスタンスを検査するべきではありません。

+0

正しいことのためにそれ:) upvoteと議論するのは難しいが、私はするつもりですエリックフォルタンの答えが「正しい」と言いましょう。それが将来的に誰かが答えを見つけるのを助けるかもしれない場合に備えて。 –

関連する問題