Programing

NoneType 객체에 단위 테스트의 assertRaises ()를 올바르게 사용하는 방법은 무엇입니까?

lottogame 2020. 6. 9. 07:37
반응형

NoneType 객체에 단위 테스트의 assertRaises ()를 올바르게 사용하는 방법은 무엇입니까? [복제]


이 질문에는 이미 답변이 있습니다.

간단한 테스트 사례를 수행했습니다.

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 예외가 발생하므로 assertRaises가 전달 될 것이라고 생각 했습니까?


python2.7 이상을 사용하는 경우 assertRaises 기능을 사용하여 컨텍스트 관리자로 사용하고 다음을 수행 할 수 있습니다.

with self.assertRaises(TypeError):
    self.testListNone[:1]

지금까지 제공된 것 이외의 다른 방법으로 python2.6을 사용하는 경우 python2.6 의 unittest 새로운 기능의 백 포트 인 unittest2를 사용하는 것이 위의 코드를 사용하여 작동하게 할 수 있습니다.

NB : unittest의 새로운 기능 (SkipTest, test discovery ...)을 좋아해서 unittest2를 최대한 많이 사용하려고합니다. python2.6 <에서 unittest가 제공하는 것보다 훨씬 많은 것이 있기 때문에 동일한 작업을 수행하는 것이 좋습니다.


문제는 메소드를 호출하기 전에 인수를 평가해야 하므로 TypeError'이전'발생 하는 문제입니다 . 다음 과 같은 표현식 을 전달해야합니다 .assertRaisesassertRaiseslambda

self.assertRaises(TypeError, lambda: self.testListNone[:1])

일반적인 사용 방법 assertRaises은 함수를 호출하는 것입니다.

self.assertRaises(TypeError, test_function, args)

함수 호출 test_function (args)가 TypeError를 발생시키는 지 테스트합니다.

문제 self.testListNone[:1]는 파이썬이 assertRaises메소드가 호출 되기 전에 표현식을 즉시 평가한다는 것 입니다. 전체 이유 test_functionargs에 별도의 인수로 전달됩니다 self.assertRaises수 있도록하는 것입니다 assertRaises전화 test_function(args)내에서 try...except허용 블록 assertRaises예외를 잡을 수 있습니다.

을 정의 self.testListNone = None하고 호출 할 함수가 필요 하므로 다음 과 같이 operator.itemgetter를 사용할 수 있습니다 .

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의 답변을 오류 메시지 (또는 일반적으로 str표현)에 대한 주장으로 확장 args하여 유용 할 수 있습니다.

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

반응형