gpt4 book ai didi

ruby - 如何使用 rspec 测试多线程 TCPServer

转载 作者:太空宇宙 更新时间:2023-11-03 16:00:03 27 4
gpt4 key购买 nike

我写了一个非常简单的日期服务器:

require 'socket'

s = TCPServer.new 3939
while (conn = s.accept)
Thread.new(conn) do |c|
c.print "Enter your name: "
name = c.gets.chomp
c.puts "Hi #{name}, the date is..."
c.print `date`
c.close
end
end

一个用户连接,产生一个线程,他们输入他们的名字,返回日期。简单。

我想知道如何在 rspec 中测试类似的东西。我的一些想法: 1.) 使用 VCR 记录服务器连接并使用 Timecop 卡住并返回日期。 2.) 在前 block 中连接到实际服务器。我不完全确定如何在运行 rspec 时执行此操作,我认为它实际上在运行服务器……或者终端只是卡住并等待某事……示例测试代码:

before
@server = TCPSever.new 3939
end

it "does something.."
conn = @server.accept
# etc
end

after
@server.close
end

3.) 建立连接。 4.) 甚至不要尝试测试线程是否已创建,只需将名称请求和日期响应放入一个方法中并进行测试即可。

我查看了 puma 的测试以了解它们如何测试线程: https://github.com/puma/puma/blob/master/test/test_puma_server.rb#L27

我非常感谢对此提供一些帮助。这只是一个简单的练习,我想看看如何最好地为这种服务器实现一些测试。比如,模拟用户连接并输入他们的名字。提前谢谢你。

最佳答案

我会考虑将服务器组织为具有此签名的类:

class DateServer
# Initialize the server. If port is 0, find
# an unused port and use that.
def initialize(port = 0)
def start
def stop
def port # return the bound port
end

然后您的测试会设置并关闭服务器:

before do
@server = Server.new
@server.start
end

after do
@server.stop
end

因为这个服务器没有副作用,你的测试将连接到它,发送一些东西,并取回一些东西:

it "prints the date" do
@socket = TCPSocket.new("localhost", @server.port)
@socket.puts "Fred"
@socket.close_write
output = @socket.read
expect(output).to match /Hi Fred/
end

要检查输出是否包含日期,请使用正则表达式。这是一个未经测试且可能不正确的示例:

  expect(output).to match /\w+ \w+ +\d+ \d+:\d+:\d+ \w+ \d+/

或者使用,例如,timecop gem,以便测试可以强制计时,然后检查日期是否完全匹配。

这个服务器没有副作用,但如果有,我会把副作用放在它们自己的对象中。假设服务器可以在用户名为“Barney”时重启盒子。不要让服务器直接这样做,而是让它调用一个“rebo​​oter”对象。在您的测试中,创建一个假的重启器并将其提供给服务器:

before do
@rebooter = double(Rebooter)
@server = Server.new(rebooter: @rebooter)
@server.start
end

然后:

"it should reboot when Barney connects" do
@rebooter.should_receive(:reboot)
@socket = TCPSocket.new("localhost", @server.port)
@socket.puts "Barney"
@socket.close_write
output = @socket.read
end

关于ruby - 如何使用 rspec 测试多线程 TCPServer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27368345/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com