Я запускаю unittests в обратных вызовах для вызовов базы данных двигателя, и я успешно поймаю AssertionErrors и получаю их поверхность при запуске nosetests, но AssertionErrors попадают в неправильный тест. Отслеживаемые файлы относятся к разным файлам.Тестирование вызовов модемов с помощью IOLoop
Мои UnitTests выглядят обычно так:
def test_create(self):
@self.callback
def create_callback(result, error):
self.assertIs(error, None)
self.assertIsNot(result, None)
question_db.create(QUESTION, create_callback)
self.wait()
А класс unittest.TestCase Я использую выглядит следующим образом:
class MotorTest(unittest.TestCase):
bucket = Queue.Queue()
# Ensure IOLoop stops to prevent blocking tests
def callback(self, func):
def wrapper(*args, **kwargs):
try:
func(*args, **kwargs)
except Exception as e:
self.bucket.put(traceback.format_exc())
IOLoop.current().stop()
return wrapper
def wait(self):
IOLoop.current().start()
try:
raise AssertionError(self.bucket.get(block = False))
except Queue.Empty:
pass
Ошибки я вижу:
======================================================================
FAIL: test_sync_user (app.tests.db.test_user_db.UserDBTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/----/Documents/app/app-Server/app/tests/db/test_user_db.py", line 39, in test_sync_user
self.wait()
File "/Users/----/Documents/app/app-Server/app/tests/testutils/mongo.py", line 25, in wait
raise AssertionError(self.bucket.get(block = False))
AssertionError: Traceback (most recent call last):
File "/Users/----/Documents/app/app-Server/app/tests/testutils/mongo.py", line 16, in wrapper
func(*args, **kwargs)
File "/Users/----/Documents/app/app-Server/app/tests/db/test_question_db.py", line 32, in update_callback
self.assertEqual(result["question"], "updated question?")
TypeError: 'NoneType' object has no attribute '__getitem__'
Где ошибка, как сообщается, находится в UserDbTest, но явно находится в test_questions_db.py (что является QuestionDbTest)
У меня возникли проблемы с носетестами и асинхронными тестами в целом, поэтому, если у кого-то есть какие-либо советы по этому поводу, это было бы также весьма полезно.
Awesome, спасибо, я буду смотреть на них и доложить – sihrc
Великого. Я добавил примечание о воссоздании MotorClient в тестах, но с использованием одного долгоживущего клиента в реальном приложении. –
Правильно! Когда я использовал один и тот же MotorClient и запускал издевавшиеся приложения в потоках, он жаловался на переключение контекстов по потокам - так как клиенты должны жить и получать доступ к одному и тому же потоку вправо? – sihrc