使用RSpec模拟TCPSocket

时间:2013-01-28 03:59:28

标签: ruby sockets rspec mocking

我正在尝试围绕一个大量使用TCPSockets的应用程序编写测试(一个特定的IRC bot)。在写我的第一堂课时,我一直在努力:

#In the describe block
before(:all) { TCPServer.new 6667 }

...允许我的TCPSockets运行(通过连接到localhost:6667),尽管它们实际上没有被正确地模拟。但是,由于我无法在同一端口上创建TCPServer,因此在迁移到第二个类时会出现问题。

如何以这样的方式模拟TCPSocket类,以便我可以测试诸如its(:socket) { should be_kind_of(TCPSocket) }之类的内容以及#readline和#write等其他常见操作?

2 个答案:

答案 0 :(得分:3)

您可以尝试在之前跟踪和关闭TCPServer 之后的

before do
  @server = TCPServer.new 6667
end

after do
  @server.close
end

it ... do
end

it ... do
end

在每次单独测试之后,TCPServer都会被杀死,因此您可以使用相同的端口创建一个新的。

答案 1 :(得分:0)

我不太确定我是否了解您的问题,但为什么不在本地计算机上安装某种irc服务器? ircd-irc2,ircd-hybrid或类似的东西?

假设你有这样实现的irc客户端:

class Bot
  attr_accessor :socket
  def initialize
    socket = TCPSocket.new("localhost", 6667)
  end
end

然后你可以像这样测试它

let(:bot) { Bot.new }

it "should be kind of TCP Socket"
  bot.should be_kind_of(TCPSocket)
  bot.should be_a(TCPSocket)
end