2016-05-17 183 views
2

我在PHP中使用Ratchet作为websockets。我能够为websockets编写单元(phpspec)和验收测试(behat),但是我找不到如何使用功能性phpunit测试来测试与websocket服务器的连接的方法。我想一个测试,它会检查连接正在运行,将是非常重要的。我想到了类似如下:PHPUnit中Websocket测试[功能]

  1. 创建(棘轮)客户端
  2. 连接到WS URL(如客户机 - >连接(主机,端口,...)
  3. 平的WebSocket /发送/接收一些消息(客户端的调用方法,例如client-> push(..)..)

问题是,我不知道哪个类负责建立连接(创建一个客户端可以请求WebSocket)在棘轮和如何测试然后看起来像我如何创建棘轮客户端为了能够在phpunit功能测试中连接并请求websocket? (类似例如一个标准的PHPUnit功能测试中的Web客户端)

作为一个例子,对于一个特征的功能测试中,我可以执行以下操作:

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

或者例如创建一个经过身份验证的客户端而不是匿名。如何将这个功能测试“翻译”成一个棘轮式websocket?

+0

所以你downvote的问题,但正如我所看到的,当我谷歌的websocket功能测试,这是显示在结果上的几个页面之一。我会稍微澄清一下我的问题。 – user3746259

回答

2

我希望这部分解决了你的棘轮WebSocket的部分负责建立连接的问题。

测试本身可能无法正常工作,我并不是那种在PHP中进行测试的经验,尽管它应该将您放在正确的道路上。

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

如果您还有其他问题,请告诉我。

+0

谢谢!正是我在找什么。所以这是服务器端到我用来建立连接的autobahnjs客户端框架的“挂件”。 – user3746259

+0

我必须警告你,PHPUnit代码可能不工作,因为我以前在PHPUnit中编写过单个UnitTest。 由于你看起来更有经验,这应该让你走上正轨。 – mitchken

+0

是的,好吧,我知道如何写phpunit我只是不知道棘轮服务器端的一部分。那是失踪的一块。额外:当你写连接到某个东西的测试时,它通常是一个功能测试。但是,我仍然可以用phpunit编写它,并知道如何:) – user3746259