2016-03-19 8 views

答えて

2

は、私はここを参照してください2つの問題があります。問題を直接修正するものと、実装をさらに単純化するMockingフレームワークのわずかな誤用です。

まず、直接あなたのアサーションをテストしようとしている方法に基づいて、あなたの問題に対処するために、あなたはここで実際に行うために探しているもの:あなたは助けるためにここにside_effectを使用する必要があります

requests.get = get 

あなたの例外を引き上げる。 documentationパー:あなたの例外を高めるために取得する必要

requests.get.side_effect = get 

:念頭に置いて

side_effect allows you to perform side effects, including raising an exception when a mock is called

、あなたが本当にする必要があるすべてはこれです。しかし、チャンスはあなたがこのエラーかもしれない顔です:

TypeError: catching classes that do not inherit from BaseException is not allowed 

これは最高することができ、実際にそれが起こっている理由についてthis偉大な答えを読むことによって説明しました。その答えで、その提案を実際にあなたがが必要なものだけを模倣するようにして、があなたの問題を完全に解決するのを助けます。だから、最後に、あなたのコードではなく、実際に嘲笑requestsモジュールの嘲笑getで、次のようになります。

class MyUnitTest(unittest.TestCase): 

    @patch('my_module.requests.get') 
    def test_my_test(self, m_get): 
     def get(*args, **kwargs): 
      raise Timeout() 

     m_get.side_effect = get 

     try: 
      my_method() 
     except MyException: 
      return 

あなたは今、実際にはさらにassertRaisesとunittestの中にあるものをより有効に利用することによって、これを簡素化することができますtry/exceptの代わりに。これは、メソッドが呼び出されたときに例外が発生したことを最終的に宣言します。さらに、にはが必要であり、タイムアウトを発生させる新しいメソッドを作成することはできません。実際には、模擬したgetには例外が発生するside_effectが含まれているということを単純に述べることができます。

m_get.side_effect = Timeout() 

しかし、あなたが実際に直接あなたのパッチデコレータにでこれを置くことができるので、今、あなたの最終的なコードは次のようになります:

class MyUnitTest(unittest.TestCase): 

    @patch('my_module.requests.get', side_effect=Timeout()) 
    def test_my_test(self, m_get):  
     with self.assertRaises(MyException): 
      my_method() 

をだから、単純にこれでその全体def getを置き換えることができます私はこれが助けて欲しい!

0

patch('my_module.requests')my_module.requestsを新しいモックオブジェクトに置き換えますが、テストメソッドでは、直接インポートした元のリクエストモジュールのrequests.getメソッドを置き換えます。つまり、変更はモジュール内に反映されません。あなたの試験方法であなたはリクエストの上、それを交換する場合、それが動作するはず

ではなく、あなたのmy_module内モック:

my_module.requests.get = get 
関連する問題