Unit-Testing의 assertRaises()를 NoneType 객체와 함께 적절하게 사용하는 방법
간단한 테스트 사례를 수행했습니다.
def setUp(self):
self.testListNone = None
def testListSlicing(self):
self.assertRaises(TypeError, self.testListNone[:1])
그리고 저는 시험이 통과되기를 기대하고 있지만, 저는 예외가 있습니다.
Traceback (most recent call last):
self.assertRaises(TypeError, self.testListNone[:1])
TypeError: 'NoneType' object is unsubscriptable
TypeError 예외가 발생하기 때문에 assertRaise는 통과할 것으로 생각했습니다.그 설명은 무엇입니까?
Python 2.7 이상을 사용하는 경우 assertRaise 기능을 사용하여 컨텍스트 관리자로 사용하고 다음 작업을 수행할 수 있습니다.
with self.assertRaises(TypeError):
self.testListNone[:1]
만약 당신이 Python 2.6을 사용하고 있다면, 지금까지 주어진 것과 다른 방법은 Python 2.6에 대한 unittest의 새로운 기능의 백포트인 unittest2를 사용하는 것이고, 당신은 위의 코드를 사용하여 그것이 작동하도록 할 수 있습니다.
N.B: 저는 유닛 테스트의 새로운 기능(SkipTest, Test Discovery 등)을 매우 좋아하기 때문에 가능한 한 유닛 테스트2를 사용할 생각입니다.Python 2.6 이하에서는 유닛 테스트가 제공되는 것보다 훨씬 더 많은 것이 있기 때문에 저도 그렇게 하는 것이 좋습니다.
문제는TypeError
'이전'으로 상승합니다.assertRaises
에 대한 인수 이후로 호출됩니다.assertRaises
메서드를 호출하려면 먼저 평가해야 합니다.당신은 a를 통과해야 합니다.lambda
다음과 같은 표현식:
self.assertRaises(TypeError, lambda: self.testListNone[:1])
일반적인 사용 방법assertRaises
함수를 호출하는 것입니다.
self.assertRaises(TypeError, test_function, args)
test_function(args) 함수 호출이 TypeError를 발생시키는지 테스트합니다.
문제는self.testListNone[:1]
파이썬이 표현을 바로 평가한다는 것입니다.assertRaises
메서드가 호출됩니다.그 이유는 무엇입니까?test_function
그리고.args
에 별도의 인수로 전달됩니다.self.assertRaises
허용하는 것입니다.assertRaises
부르는 것test_function(args)
내부에서try...except
블록, 허용assertRaises
예외를 포착하기 위해.
정의했으므로self.testListNone = None
호출할 함수가 필요합니다. operator.item을 사용하면 다음과 같습니다.
import operator
self.assertRaises(TypeError, operator.itemgetter, (self.testListNone,slice(None,1)))
부터
operator.itemgetter(self.testListNone,slice(None,1))
는 장황한 말입니다.self.testListNone[:1]
하지만 이것은 기능을 분리합니다.operator.itemgetter
) 주장으로부터.
전체 스니펫은 다음과 같습니다.오류 메시지(또는 일반적으로 인수의 문자열 표현)에 대한 mouad의 응답을 확장하여 유용할 수 있습니다.
from unittest import TestCase
class TestNoneTypeError(TestCase):
def setUp(self):
self.testListNone = None
def testListSlicing(self):
with self.assertRaises(TypeError) as ctx:
self.testListNone[:1]
self.assertEqual("'NoneType' object is not subscriptable", str(ctx.exception))
언급URL : https://stackoverflow.com/questions/6103825/how-to-properly-use-unit-testings-assertraises-with-nonetype-objects
'programing' 카테고리의 다른 글
각 행에 대해 가장 큰 값의 열 이름을 반환합니다. (0) | 2023.06.26 |
---|---|
소수(s,p) 또는 숫자(s,p)? (0) | 2023.06.26 |
어떤 숫자가 다른 숫자로 구분되는지 어떻게 확인합니까? (0) | 2023.06.21 |
체크아웃을 취소하려면 어떻게 해야 합니까? (0) | 2023.06.21 |
null이 아니거나 빈 문자열이 아닌지 테스트할 호환 SQL (0) | 2023.06.21 |