4

私はこのようなコードを持っています:

def extract(data):
    if len(data) == 3:
       a = 3
    else:
        component = data.split("-")
        if len(component) == 3:
            a,b,c = component
        else:
            raise globals.myException("data1", "Incorrect format", data)

    return a,b,c

これは単純化されたものです。例外クラス globals.myException をモックしたい。私はそれをやっています:

def test_extract_data_throws_exception(self):
        with patch('globals.myException') as mock: 
            mock.__init__("data1", "Incorrect format", "")
            with self.assertRaises(myException):
                self.assertEqual(extract(""), (""))

そして、私はいつもエラーを受け取ります:

編集:@Aaron Digullaが示唆しているように、モンキーパッチは正しい解決策です。他の人を助けるために解決策を投稿します。

def test_extract_data_throws_exception(self):
        #monkey patching
        class ReplaceClass(myException):
            def __init__(self, module, message, detail = u''):
                pass

        globals.myException = ReplaceClass
        with self.assertRaises(myException:
            self.assertEqual(extract(""), (""))
4

1 に答える 1

4

その理由はraise、引数の型をチェックするためです。文字列(別名「古いスタイルの例外」)であるか、から派生したものでなければなりませんBaseException

モックもそうではないので、raise使用を拒否します。

この特定のケースでは、例外を発生させるか、モンキー パッチを使用する必要があります (= テストでシンボルglobals.myExceptionを上書きし、後で復元します)。

于 2013-02-08T11:18:34.897 に答える