2

私は明らかに、Pythonで例外を発生させる方法についていくつかの根本的な誤解を持っています。私がやろうとしている(そして失敗している)ことの最も簡単な例を含めています。新しい例外を作成し、それが機能するかどうかを適切にテストしようとしています。

import random
import unittest

# Create new class of exception
class LearningError(Exception):
    pass

# Create function
def addition_no_four(first, second):
    """Add two numbers (as long as it isn't 4)."""
    if (first == 4) or (second == 4):
        raise LearningError("We don't take 4s!")
    return first + second

# Properly working example code that tests raising errors
class TestSequenceFunctions(unittest.TestCase):
    def setUp(self):
        self.seq = range(10)
    def test_shuffle(self):
        random.shuffle(self.seq)
        self.seq.sort()
        self.assertEqual(self.seq, range(10))
        self.assertRaises(TypeError, random.shuffle, (1,2,3))

# My code which tests 
class TestAddition(unittest.TestCase):
    def test_addition(self):
        """Test whether it works for 2 numbers (not 4)."""
        first = 2
        second = 5
        self.assertEqual(addition_no_four(first, second), 7)
    def test_raise(self):
        """Learn how to create an exception and test its implementation."""
        self.assertRaises(LearningError, addition_no_four(2, 4))

if __name__ == "__main__":
    unittest.main()

これは次のメッセージで失敗します:

Traceback (most recent call last):
  File "test.py", line 34, in test_raise
    self.assertRaises(LearningError, addition_no_four(2, 4))
  File "test.py", line 12, in addition_no_four
    raise LearningError("We don't take 4s!")
LearningError: We don't take 4s!

----------------------------------------------------------------------
Ran 3 tests in 0.000s

FAILED (errors=1)

それは起こりません(つまり、サンプルコードは前の例外を正しくテストします。この種のことを実現するには、何を変更する必要がありますか?

4

1 に答える 1

3

小さな変更があります。assertRaisesを使用するときは、関数を直接呼び出さないように注意してください。代わりに、その引数をassertRaisesの引数として渡す必要があります。これにより、assertRaisesテストメソッドは、関数が呼び出される前にtry/exceptを設定できます。

def test_raise(self):
    """Learn how to create an exception and test its implementation."""
    self.assertRaises(LearningError, addition_no_four, 2, 4)

また、assertRaisesをコンテンツマネージャーとして使用することで、この問題を回避することもできます。

def test_raise(self):
    """Learn how to create an exception and test its implementation."""
    with self.assertRaises(LearningError):
        addition_no_four(2, 4)
于 2013-02-05T04:31:51.983 に答える