2013-04-04 3 views
0

Я пишу UnitTests в Python с использованием assertEqual:Сделать assertEqual не преминуло на RuntimeErrors, начиная с определенной строкой

def test_SetOwner(self, owner): 
    self.objectid.SetOwner(owner) 
    self.assertEqual(self.objectid.GetOwner(), owner) 

Это работает в большинстве случаев, но в некоторых конкретных случаях это не удается с RuntimeError начиная с Could not execute... , Однако ожидается, что en не должно вызывать ошибку в пакете unittest.

Есть ли способ каким-то образом сделать assertEqual не сбой на RuntimeErrors, начиная с этой конкретной строки, все еще захватывая все остальные RuntimeErrors? Или есть лучший способ справиться с этим?

+2

Не могли бы вы его обернуть в блок 'try:'/'except RuntimeError как exc:', а затем передать или ререйз в зависимости от 'exc.args'? – DSM

+1

Почему ваш единичный тест недетерминирован? Да, вы можете поймать RuntimeError, а затем проверить 'e.args [0]' для нужной строки, но в целом, модульные тесты должны проходить через очень специфический сценарий, чтобы проверить результат части кода и иметь единичный тест позволяет два * очень * разных поведения, кажется мне, как запах кода. – tom

ответ

2

Вы можете сделать это, используя блок try/except, и проверить два случая отдельно.

def test_SetOwner(self, owner): 
    self.objectid.SetOwner(owner) 
    try: 
     owner_prime = self.objectid.GetOwner() 
    except RuntimeError as e: 
     self.assertTrue(e.args[0].startswith("Could not execute")) 
    else: 
     self.assertEqual(owner, owner_prime) 

Но, как упоминалось в моем комментарии выше, это не похоже на очень хороший модульный тест. Что, если, например, в какой-то момент ошибка вводится в GetOwner(), так что она всегда поднимает значение «Не удалось выполнить» RuntimeError? Это почти наверняка не будет желательным поведением, но ваш тест будет продолжать проходить.

+0

Я бы добавил, что если это недетерминированное поведение зависит от какой-либо внешней программы/ресурса, OP должен определенно высмеять его, чтобы получить более надежные тесты в хорошо известных ситуациях. – Bakuriu

Смежные вопросы