py.test with Twisted and Unhandled Errors
“illegal switch in blockon”
py.test is awesome. I really love the clean testing style it allows, and the flexibility of
@fixture s is great.
I find the fixtures especially useful for higher-level testing, like integration or functional tests where you often have something that is expensive to set up (e.g. a Selenium browser instance) that’s perfectly fine to re-use in a bunch of tests.
Anyway, I was getting a weird and inscrutible error message when using
py.test along with the twisted plugin
These usually work quite well together, but I found that in some error-cases when my fixture wasn’t getting set up, the
pytest.blockon call would simply hang, and a ctrl-c would lead to an odd-sounding error (
AssertionError: illegal switch in blockon) but of course formatted nicely around pytest-twisted’s internals.
I even managed to make an SSCCE for it! Happy day!
from twisted.internet.defer import Deferred from twisted.internet import reactor import pytest @pytest.fixture def foo(): d = Deferred() def blammo(): raise RuntimeError('foo') reactor.callLater(0.1, blammo) return pytest.blockon(d) def test_meaning(foo): assert foo == 42
So the short version of the story is that it’s an unhandled exception. The “hanging” makes perfect sense in this context:
d is never getting a
.errback triggered on it.
I don’t know
py.test internals well enough to suggest anything they can do to improve error-logging in cases like this. If anyone has a suggestion, I’d be glad to know it!
I couldn’t find any information about this on the Internets, so hopefully this saves someone else an hour or two.