将函数中引发的错误传递给 UnitTest 引发的异常

Pass Raised Error in function to Exception Raised by UnitTest

我想编写一个函数,在它失败时引发错误,然后将其传递给单元测试。考虑以下因素:

class undefinedTerms(unittest.TestCase):

    def setUp(self):
        self.A = frozenset((1,2,3,2,1,4,2,5,6,3,5,7,1,5,2,4,8))
        self.B = frozenset((1,4,5,6,3,4,2,5,4,3,1,3,4,2,5,3,6,7,4,2,3,1))
        self.C = frozenset((1,2,3,2,1,4,2,5,6,3,5,7,1,5,2,4))
        self.D = (1,2,1)

    def is_a_set(self,set_this):
        try:
            assert isinstance(set_this, (set,frozenset))
        except TypeError:
            raise TypeError("The object you passed is not a set.")
        return True

    def test_A_is_a_set(self):
         self.assertTrue(self.is_a_set(self.A))

    def test_B_is_a_set(self):
         self.assertTrue(self.is_a_set(self.B))

    def test_C_is_a_set(self):
         self.assertTrue(self.is_a_set(self.C))

    def test_D_is_a_set(self):
         self.assertTrue(self.is_a_set(self.D), self.is_a_set(self.D))


suite = loader.loadTestsFromTestCase(undefinedTerms)
unittest.TextTestRunner(verbosity=2).run(suite)

这给出了以下输出。

test_A_is_a_set (__main__.undefinedTerms) ... ok
test_B_is_a_set (__main__.undefinedTerms) ... ok
test_C_is_a_set (__main__.undefinedTerms) ... ok
test_D_is_a_set (__main__.undefinedTerms) ... FAIL

======================================================================
FAIL: test_D_is_a_set (__main__.undefinedTerms)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "<ipython-input-33-4751f8653e7a>", line 27, in test_D_is_a_set
    self.assertTrue(self.is_a_set(self.D), self.is_a_set(self.D))
  File "<ipython-input-33-4751f8653e7a>", line 12, in is_a_set
    (type(set_this) is set))
AssertionError

----------------------------------------------------------------------
Ran 4 tests in 0.001s

FAILED (failures=1)

我想要的是函数中定义的AssertionErrorTypeError。我对完全不同的实现持开放态度。

更新

我想我不清楚我到底在追求什么。阅读评论和答案后,我相信我想要的是创建一个自定义断言。

之前已解决此问题 here

如何使用.assertIsInstance()

def assert_is_set(self, set_this):
        self.assertIsInstance(set_this, (set, frozenset))

此时,您并不真正需要函数,只需内联检查即可。

如果您的条件变得更复杂,您也可以使用更通用的 .fail() 方法。

Signals a test failure unconditionally, with msg or None for the error message

if something:
    self.fail("Computer broken!")

文档页面在 TestCases

中有一个 list of all the assertions available

正如提议的那样here,我相信我所追求的是自定义断言方法。这是我使用的最终实现。

class SetAssertions:
    def assertIsASet(self, set_this):
        if not isinstance(set_this, (set,frozenset)):
            raise AssertionError("The object you passed is not a set.")

import unittest

class undefinedTerms(unittest.TestCase, SetAssertions):

   def setUp(self):
       self.A = frozenset((1,2,3,2,1,4,2,5,6,3,5,7,1,5,2,4,8))
       self.B = frozenset((1,4,5,6,3,4,2,5,4,3,1,3,4,2,5,3,6,7,4,2,3,1))
       self.C = frozenset((1,2,3,2,1,4,2,5,6,3,5,7,1,5,2,4))
       self.D = (1,2,1)

   def test_A_is_a_set(self):
        self.assertIsASet(self.A)

   def test_B_is_a_set(self):
        self.assertIsASet(self.B)

   def test_C_is_a_set(self):
        self.assertIsASet(self.C)

   def test_D_is_a_set(self):
        self.assertIsASet(self.D)


suite = loader.loadTestsFromTestCase(undefinedTerms)
unittest.TextTestRunner(verbosity=2).run(suite) 

test_A_is_a_set (__main__.undefinedTerms) ... ok
test_B_is_a_set (__main__.undefinedTerms) ... ok
test_C_is_a_set (__main__.undefinedTerms) ... ok
test_D_is_a_set (__main__.undefinedTerms) ... FAIL

======================================================================
FAIL: test_D_is_a_set (__main__.undefinedTerms)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "<ipython-input-39-495718fb2bad>", line 32, in test_D_is_a_set
    self.assertIsASet(self.D)
  File "<ipython-input-39-495718fb2bad>", line 6, in assertIsASet
    raise AssertionError("The object you passed is not a set.")
AssertionError: The object you passed is not a set.

----------------------------------------------------------------------
Ran 4 tests in 0.002s

FAILED (failures=1)