Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add testing methods/examples #1

Closed
TronPaul opened this issue Feb 12, 2014 · 7 comments
Closed

Add testing methods/examples #1

TronPaul opened this issue Feb 12, 2014 · 7 comments

Comments

@TronPaul
Copy link

I'm currently attempting to write a test case for a method with the @socketio.on decorator, but there are no simple methods to generate a request that would result in routing to that method.

with app.test_client() as c:
    s = c.websocket('/namespace')
    s.emit('event', {'stuff':'here'})
    # assert stuff
@TronPaul
Copy link
Author

If I can get something working that looks like my sample code I'll make a pull request. If anyone has any other ideas for how to accomplish this, I'd love to see them.

@miguelgrinberg
Copy link
Owner

I was thinking that for unit tests I was going to start the app for real and use a websocket client to acccess it. There is client that looks decent: https://pypi.python.org/pypi/websocket-client/, but I haven't tried it yet.

@TronPaul
Copy link
Author

I didn't really want to do end to end testing at this stage. And you can set the test_client_class in flask. I think I should be able to extend FlaskClient (flask's test client) to behave as expected for websockets. Would something of that nature be good for a pull request?

@miguelgrinberg
Copy link
Owner

Oh sure, if you manage to get testing going I would take it.

I'm not sure you need a connection to the test client, though, since the socket stuff runs independently. You could have a SocketIOTestClient class for example that can send and receive socket.io messages.

The send() and emit() methods in this client would just invoke recv_message(), recv_json() or process_event() in the SocketIO object.

Receiving events from the server is going to be a little bit more tricky, you will need to get the GenericNamespace objects to inherit from a class that is compatible with BaseNamespace from gevent-socketio, but that instead of routing messages through the real thing it makes the messages available to the test client.

@TronPaul
Copy link
Author

Well the socket stuff runs independently, but there's a few things on the behavior of the context globals (with respect to their modifications with Flask-SocketIO) in flask that I'd like to test. I'd imagine that it'd be easier to tie it in with an additional mixin to the FlaskClient, but just having a test_client on the socketio might be simpler and fit my use case. I'll see how this goes.

@miguelgrinberg
Copy link
Owner

Ah, but the context globals are all handled SocketIO.dispatch_message(), which is invoked by recv_message(), recv_json() and process_event(), so I think if you follow my advice you are covered on that front.

@miguelgrinberg
Copy link
Owner

I believe the need for unit tests is now addressed. Closing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants