user3746259 user3746259 - 5 months ago 71
PHP Question

Websocket Testing [Functional]

I am using Ratchet for websockets in PHP. I was able to write unit (phpspec) and acceptance tests (behat) for websockets but I cannot find a way on how to test the connection to the websocket server by using a functional phpunit test.. I think a test, which checks if the connection is up and running, would be very important. I thought of something like the following:

  1. Create a (ratchet) client in phpunit

  2. Connect to ws url (e.g. client->connect(host, port, ...)

  3. ping websocket / send / receive some messages (call methods of client, e.g. client->push(..)..)

The problem is, that I don't know which class is responsible for establishing the connection (creating a client which can request the websocket) in Ratchet and how a test would then look like. How can I create a Ratchet Client in order to be able to connect and request a websocket in phpunit functional test? (similar to e.g. a webclient within a standard phpunit functional test)

As an example, within a functional test for a feature, I could do the following:

$client = static::createClient();
$client->request('GET', '/book/3', array(), array(), array('HTTP_X-Requested-With' => 'XMLHttpRequest'));
$response = $client->getResponse();

Or e.g. create an authenticated client instead of an anonymous. How would it be possible, to "translate" this functional test into a ratchet websocket one?


I hope this partially solves your question of what part of the Ratchet Websocket is responsible of making a connection.

The test itself will probably not work, I am not that experienced with testing in PHP although it should put you on the right path.

public function testCanConnect()
        \Ratchet\Client\connect('ws://')->then(function($conn) {
            $conn->on('message', function($msg) use ($conn) {
                print $msg."\n";
                $this->assertEquals("Hello World",$msg);
            $conn->send('Hello World!');
        }, function ($e) {
            echo "Could not connect: {$e->getMessage()}\n";

If you have any further questions please let me know.