2010-05-25 1 views
-1

Я пытаюсь запустить следующее испытаниеПроблемы с функцией assertRaises в Python

self.assertRaises(Exception,lambda: 
unit_test.testBasic()) 

где

test.testBasic() 

является

class IsPrimeTest(unittest.TestCase): 
    def assertRaises(self,exception,callable,*args,**kwargs): 
     print('dfdf') 
     temp = callable 
     super().assertRaises(exception,temp,*args,**kwargs) 

    def testBasic_helper(self): 

     self.failIf(is_prime(2)) 
     self.assertTrue(is_prime(1)) 

где премьер является функцией, и

но в

self.assertRaises(Exception,lambda: 
unit_test.testBasic()) 

функция лямбды оленья кожа генерирует исключение после проверки по

def testBasic_helper(self): 

    self.failIf(is_prime(2)) 
    self.assertTrue(is_prime(1)) 

терпит неудачу Может кто-нибудь предлагает решение этой проблемы?


Я попытаюсь объяснить мою проблему, опять же, потому что в моем первом посте я не объяснить это очень хорошо Так вот источник is_prime (х) это просто функция для проверки штрихом номера

защиту is_prime (номер): ПРЕМЬЕР, NOT_PRIME = не is_prime.broken, is_prime.broken , если число == 2: возврата PRIME

if not isinstance(number, int) and not isinstance(number, float): 
    raise Exception 

if number % 2 == 0 or number < 2 or isinstance(number, float): 
    return NOT_PRIME 

max = int(number**0.5) + 1 
for i in range(3, max, 2): 
    if number % i == 0: 
     return NOT_PRIME 
return PRIME 

I s_prime.broken = False

класс IsPrimeTest (unittest.TestCase):

def testBasic_helper(self): 

      self.failIf(is_prime(1)) 
      self.assertTrue(is_prime(2)) 
      self.failIf(is_prime(4)) 
      self.failIf(is_prime(6)) 
      self.assertTrue(is_prime(7)) 


def testBasic(self): 
    return self.testBasic_helper() 

def testNegative(self): 
    self.failIf(is_prime(-2)) 
    self.failIf(is_prime(-11 ** 3)) 

def testNonNumber(self): 
    self.assertRaises(Exception,is_prime,'asd') 
    self.assertRaises(Exception,is_prime,self.__class__.__name__) 

def testRandom(self): 

    for i in range(0,10000): 
     rand = randint(-10000,10000) 
     self.assertEquals(prime(rand),is_prime(rand)) 

и вот тест, мы можем сказать, что тест тестирует программу, которая является испытание - испытание над тест

класс MetaProgrammingTest (unittest.TestCase): защиту test_decorator (Я): от импорта p10 unit_converter

def celsius_function(val): 
     return val 

    self.assertTrue(hasattr(unit_converter(1,2),'__call__')) 
    decorated = unit_converter(1.8, 32)(celsius_function) 
    self.assertTrue(hasattr(decorated, '__call__')) 
    self.assertAlmostEquals(64.4, decorated(val = 18.0)) 


def test_unit_test(self): 
    import p10 
    from p10sample import is_prime as is_prime_actual 

    unit_test = p10.IsPrimeTest('testBasic') 
    unit_test.setUp() 

    is_prime_actual.broken = False 

    self.assertEquals(None, unit_test.testBasic()) 
    self.assertEquals(None, unit_test.testNegative()) 
    self.assertEquals(None, unit_test.testNonNumber()) 
    self.assertEquals(None, unit_test.testRandom()) 

    is_prime_actual.broken = True 

    self.assertRaises(Exception,lambda: unit_test.testBasic()) 
    self.assertRaises(Exception, lambda: unit_test.testNegative()) 
    self.assertRaises(Exception, lambda: unit_test.testRandom()) 

    unit_test.tearDown() 

я не могу изменить второй тест - тест по испытанию Поэтому выражение self.assertRaises (Exception, лямбда: unit_test.testBasic()) должен остаться unchaged Моя проблема заключается в том, что когда функция testBasic() сбой, например, если у нас есть self.assertFailIf (is_prime (2)), self.assertfailIf генерирует исключение, unit_test.testBasic() выдает одно и то же исключение в верхнюю область, но lambda: unit_test.testBasic() does not throws исключение и проверка self.assertRaises (исключение, лямбда: unit_test.testBasic()) не работает Мой вопрос заключается в том, как сделать функцию testBasic() так, чтобы лямбда: unit_test.testBasic() будет отражать exceotion и selfassertRaises не подведет, любые идеи?

+0

Код отформатирован только для обозначения линий с четырьмя пробелами, не добавляя '>'. Это цитата. –

ответ

1

Насколько я правильно понимаю вас в том, что вы спрашиваете, почему метод testBasic_helper не вызывает исключения при запуске теста? Я не понимаю, почему он должен, is_prime должен вернуть значение bool, против которого проверка проверяет наличие ошибки. Если тест не удался, он просто терпит неудачу, ни ваш код, ни рамки unittest не выбрасываются в исключение.

P.S. «unit_test.testBasic» уже является вызываемым, «lambda: unit_test.testBasic()» лишним, поэтому вы можете просто написать self.assertRaises (Exception, unit_test.testBasic).

+0

Что означает «сверхъестественное»? –

+0

Это опечатка, правильно написана, она «лишняя», то есть она не нужна. – joe