71196


## はじめに Pythonのunittestライブラリの中のTestCaseのassertRaisesメソッドの中身を確認する。

Pythonの[assertRaises](https://docs.python.org/ja/3/library/unittest.html#unittest.TestCase.assertRaises)のソースコードを確認するため、下記のように`inspect`
モジュールの `getsource` 関数を用いました。

[code]

    >>> import inspect
    >>> import unittest
    >>> print(inspect.getsource(unittest.TestCase))
    
[/code]

## error_codeが再現出来ない

上記で出力された文の中からassertRaisesのドックストリングを確認していくと下のような記載がありました。

[code]

    with self.assertRaises(SomeException) as cm:
        do_something()
        the_exception = cm.exception
        self.assertEqual(the_exception.error_code, 3)
    
[/code]

上記を再現するために下記のようなスクリプト(~/test.py)をローカルで作成しました。

[code]

    import unittest
    def do_something():
        ValueError.error_code = 3
        raise ValueError
    
    class Test_Do(unittest.TestCase):
        def test_do(self):
            with self.assertRaises(ValueError) as cm:
                do_something()
            the_exception = cm.exception
            self.assertEqual(the_exception.error_code, 3)
    
[/code]

上記に対して`python -m unittest ~/test.py`を行ったところ下記のようなエラーが出ました。

[code]

    ERROR: test_do (test.Test_Do)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Users/kumamoto/Desktop/python_pr/test.py", line 9, in test_do
        do_something()
      File "/Users/kumamoto/Desktop/python_pr/test.py", line 3, in do_something
        ValueError.error_code = 3
    TypeError: can't set attributes of built-in/extension type 'ValueError'
    
[/code]

assertRaisesのドックストリングにあるerror_code=3を再現するにはどのようにdo_something関数を書き直すべきでしょうか。

簡単な質問で申し訳ないのですが、どなたか教えていただけると幸いです。よろしくお願いします。


CC BY-SA 4.0
2020-10-14T15:28:24.537
71195
2020-10-14T22:45:48.193
2020-10-14T22:45:48.193
32986
40683
question
python python3 テスト
assertRaisesのドックストリングの中に出てくる「error_code」がどこから出てきたものなのかが知りたい


`SomeException`(custom exception)を定義する必要があります。

[code]

    import unittest
    
    class SomeException(Exception):
        def __init__(self, error_code):
            self.error_code = error_code
    
    def do_something():
        raise SomeException(3)
    
    class Test_Do(unittest.TestCase):
        def test_do(self):
            with self.assertRaises(SomeException) as cm:
                do_something()
            the_exception = cm.exception
            self.assertEqual(the_exception.error_code, 3)
    
[/code]

[code]

    $ python3 -m unittest test.py
    .
    ----------------------------------------------------------------------
    Ran 1 test in 0.000s
    
    OK
    
[/code]


CC BY-SA 4.0
2020-10-14T16:13:01.507
71196
2020-10-14T16:13:01.507
71195
answer