Как получить покрытие для юнит-теста внутри цикла for? - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь проверить исключение с assertRaises при исправлении BeautifulSoup.select.

Метод, который захватывает идентификаторы с веб-страницы, принимает html resultsPage

def parseOutIds(resultsPage):

    soup = BeautifulSoup(resultsPage, "html.parser")

    records = soup.select('some-html-tags')
    parsed = []
    for record in records:
        try:
            ampData = json.loads(record["other-tags"])
            parsed.append(ampData)
        except json.decoder.JSONDecodeError from err # Missing coverage

    return parsed

Вспомогательные методы и тесты, описанные выше. Я поднимаю ValueError, так как json.decoder.JSONDecodeError наследует от него на основе этого ответа .

def loadHtml(self, fileName):
    with open('path/to/test'+filename) as f:
         self.html = file.read().strip()

def test_parseOutIds(self):
    self.loadHtml('test-html.html')

    #errorMock method just raises ValueError exception
    bsPatch = patch('bs4.BeautifulSoup.select', self.errorMock) 
    with bsPatch:
        with self.assertRaises(ValueError):
             parseOutIds(self.html)

В моем текущем тесте выше не хватает места для строки исключения.

Другие вопросы:

  1. Должен ли я также исправлять json.load?
  2. Из того, что я видел из других ответов, я тоже издеваюсь над другимспособ из-за того, что существует цикл?

1 Ответ

0 голосов
/ 03 ноября 2019

В вашем коде есть несколько заблуждений:

  • A ValueError не попадет в предложение except json.decoder.JSONDecodeError - вы можете ловить объекты из классов, производных от json.decoder.JSONDecodeError, но неродительские классы из json.decoder.JSONDecodeError.
  • Вызов soup.select находится за пределами блока try - поэтому исключения, выданные из soup.select, все равно не будут перехвачены.

СейчасОтносительно вашей проблемы с тестированием: я бы сказал, что вам не нужно ничего исправлять, чтобы протестировать parseOutIdsВам нужно только предоставить соответствующий ввод HTML для соответствующего теста. В вашем случае вы хотите написать тест, чтобы охватить исключительную часть. Это означает, что для ввода html потребуется одна из записей, содержащих недопустимые данные JSON. Это тогда заставит json.loads выбросить json.decoder.JSONDecodeError.

...