2015-02-19 5 views
0

Я хотел бы обеспечить с тестами, которые: - приложение может не быть импортированы - приложение может быть запущен в качестве реального приложения (например: питон src.py)Дразнящий __main__

Я заинтересован о том, что , почему следующее не работает:

src.py

class A: 
def x(self): 
    print('this is x') 

if __name__ == '__main__': 
    A().x() 

test.py (фрагмент)

class Test(unittest.TestCase): 
    @mock.patch('src.A.x') 
    def test_main(self, mock_x): 
    import src 
    mock_x.assert_any_call() 

Этот тест не подходит ... почему?

ответ

1

Поскольку имя модуля при импорте составляет src, а не __main__.

Самым простым решением было бы перенести этот код в функцию:

def main(): 
    A().x() 

if __name__ == '__main__': 
    main() 

и в тесте, вы бы вызвать src.main()

@mock.patch('src.A.x') 
def test_main(self, mock_x): 
    import src 
    src.main() 
    mock_x.assert_any_call() 
+0

что не гарантирует, что основной() вызывается только тогда, когда приложение вызывается как скрипт (Python src.py) – vpas

+0

Вы правильно. Вы также можете убедиться, что он * не * вызывается перед вызовом 'main()' –

+0

, как вы это понимаете? – vpas

0

Чтобы проверить, что модуль не ввозу вы делаете не нужно использовать насмешки.

См. assertRaises.

Просто проверьте, не возникает ли ошибка при импорте od модуля.

with self.assertRaises(...): 
    ... 
+0

это не так ... – vpas

+0

Вы сказали, что хотите убедиться, что ваш модуль не может быть импортирован. Это может быть проверено с моим кодом. Пожалуйста, уточните то, что вы просите, и дайте сенсационные комментарии, а не «это неправда ...» ... – lschmierer

+0

Если модуль не импортируется, Python вызовет ошибку. Это то, что я догадался, что вы хотите проверить. – lschmierer

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