Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何测试Hanami的WebSocket?_Websocket_Rspec_Hanami - Fatal编程技术网

如何测试Hanami的WebSocket?

如何测试Hanami的WebSocket?,websocket,rspec,hanami,Websocket,Rspec,Hanami,使用以下命令: 我已经能够将WebSocket添加到Hanami中,但是因为这是针对生产代码的,所以我想添加规范;但是我找不到关于如何使用Rspec测试WebSockets和Hanami的信息 我已经能够找到这个,但没有非Rails特定的或特定于Hanami的,我已经在Hanami Gitter上询问过,但还没有得到回应 这是唯一的办法吗?我更喜欢更简单的东西,但如果我必须的话,我会如何为via设置它 如何使用Rspec测试Hanami的WebSockets?要使其正常工作,需要几个移动

使用以下命令:

我已经能够将WebSocket添加到Hanami中,但是因为这是针对生产代码的,所以我想添加规范;但是我找不到关于如何使用Rspec测试WebSockets和Hanami的信息

我已经能够找到这个,但没有非Rails特定的或特定于Hanami的,我已经在Hanami Gitter上询问过,但还没有得到回应

这是唯一的办法吗?我更喜欢更简单的东西,但如果我必须的话,我会如何为via设置它


如何使用Rspec测试Hanami的WebSockets?

要使其正常工作,需要几个移动部件,第一个是模拟web服务器上接收套接字的套接字模拟器:

注意
url\u路径
应定制为适用于web套接字特定端点的路径

#冻结的字符串文字:true
需要“彪马”
需要“精简电缆/服务器”
需要\u相对“同步\u客户端”
类SocketSimulator
def初始化(x_站点id_标题:nil)
@服务器日志=[]
@x_站点id_标头=x_站点id_标头
结束
属性访问器:服务器日志
def客户端
如果@client返回@client
url_path=“/ws?连接_令牌=#{connection_令牌}”
@client=SyncClient.new(“ws://127.0.0.1:3099{url\u path}”,标题:标题,cookie:“”)
结束
def连接令牌
@连接令牌| |=SecureRandom.hex
结束
def用户
如果@user返回@user
电子邮件=“#{SecureRandom.hex}@mailinator.com”
密码=SecureRandom.hex
@用户=制造。创建:用户,电子邮件:电子邮件,站点id:站点id,密码:密码
结束
def启动
@server=Puma::server.new(
LiteCable::Server::Middleware.new(nil,连接类:Api::Sockets::connection),
Puma::Events.strings
).点击do | server|
server.add_tcp_侦听器'127.0.0.1',3099
server.min_threads=1
server.max_线程数=4
结束
@server_thread=thread.new{@server.run.join}
结束
def拆卸
@服务器和停止(true)
@服务器线程&.join
@服务器日志。清除
结束
def标题
{
'授权'=>“持票人#{jwt}”,
'X_HANAMI_DIRECT_BOOKINGS_SITE_ID'=>@X_SITE_ID_header||SITE_ID
}
结束
def站点id
@站点_id | |=SecureRandom.hex
结束
def jwt
@jwt | |=交互者::用户::GenerateJwt.new(用户,站点id).call.jwt
结束
结束
接下来是SyncClient,它是一个假客户端,您可以使用它实际连接到模拟套接字:

#冻结的字符串文字:true
#同步websocket客户端
#从复制和修改https://github.com/palkan/litecable/blob/master/spec/support/sync_client.rb
类同步客户端
需要“websocket客户端简单”
需要“并发”
需要“插座”
当预期事件=5时等待
当事件=0.5时等待
属性读取器:pings
def初始化(url,标题:{},cookie:“”)
@messages=Queue.new
@closed=Concurrent::Event.new
@has_messages=Concurrent::Semaphore.new(0)
@pings=Concurrent::AtomicFixnum.new(0)
@open=并发::Promise.new
@ws=设置web套接字(url、头.merge('COOKIE'=>cookies))
@开门,等等!(期待事件时等待)
结束
def ip
Socket.ip\u地址\u列表。检测(&:ipv4\u private?)。尝试(:ip\u地址)
结束
def设置web套接字(url、标题)
WebSocket::Client::Simple.connect(
网址,
标题:标题
)do | ws|
ws.on(:error,&方法(:on_error))
ws.on(:open,&方法(:on_open))
ws.on(:消息和方法(:on_消息))
ws.on(:close,&方法(:on_close))
结束
结束
def on_错误(事件)
event=RuntimeError.new(event.message),除非event.is_?(异常)
如果@open.pending?
@打开。失败(事件)
其他的
@消息标识符,
'键入'=>'确认订阅'
)
互动电话
expect(客户端读取消息)到eq(
“标识符”=>标识符,
'消息'=>消息
)
结束
上下文“与其他连接”是否执行
let(:user2){maufacture.create:user}
let(:jwt){interactitors::Users::GenerateJwt.new(user2,site_id).call.jwt}
let(:site_id){socket_simulator.site_id}
let(:url_path){/ws?连接_令牌=#{SecureRandom.hex}
let(:client2){SyncClient.new(“ws://127.0.0.1:3099{url\u path}”,头:{},cookie:“”)
在做之前
client2.send_message命令:“订阅”,
标识符:标识符
结束
它“不向不应该得到它的连接广播”吗
聚合_失败的广播!“做
expect(client2.read_message).to eq('type'=>'welcome'))
期望(客户端2.读取消息)。到eq(
“标识符”=>标识符,
'键入'=>'确认订阅'
)
expect(client.read_message).to eq('type'=>'welcome')
expect(客户端读取消息)到eq(
“标识符”=>标识符,
'键入'=>'确认订阅'
)
互动电话
睡眠1
expect(客户端读取消息)到eq(
“标识符”=>标识符,
'消息'=>消息
)
期望{client2.close}.not_引发_异常
结束
结束
结束
结束
结束

要实现此功能,需要几个移动部件,第一个是模拟Web服务器上接收套接字的套接字模拟器:

注意
url\u路径
应定制为适用于web套接字特定端点的路径

#冻结的字符串文字:true
需要“彪马”
需要“精简电缆/服务器”
需要\u相对“同步\u客户端”
类SocketSimulator
def初始化(x_站点id_标题:nil)
@服务器日志=[]
@x_站点id_标头=x_站点id_标头
结束
属性访问器:服务器日志
def客户端
如果@client返回@client
url_path=“/ws?连接_令牌=#{connection_令牌}”
@client=SyncClient.new(“ws://127.0.0.1:3099{url\u path}”,标题