programing

Unit-Testing의 assertRaises()를 NoneType 객체와 함께 적절하게 사용하는 방법

skycolor 2023. 6. 26. 21:11
반응형

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

반응형