在Rspec模拟TCPSocket

时间:2013-12-30 21:05:04

标签: ruby-on-rails unit-testing rspec tcpsocket

我有一个简单的方法连接到TCP服务器并放置单行字符串并关闭连接。关闭连接后,方法将重定向到特定页面。

我有兴趣测试该方法的重定向,而不关心TCP连接值。因此,我最好的选择是模拟连接。这是方法,

def print
  server = TCPSocket.new('a.b.c.d', 56423)
  server.puts "Hello Everyone"
  server.close

  redirect_to root_url
end

我的测试看起来像是,

it 'redirects to root_url' do
  get :print
  expect(response).to redirect_to(root_url))
end

我的问题是,我不知道如何模拟连接,以便我可以进入重定向部分。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

有许多方法可以做到这一点,如https://www.relishapp.com/rspec/rspec-mocks/v/3-0/docs中所述。它们在语法和约束执行的程度方面各不相同。

最宽松的方法之一是在get来电之前加入以下内容:

server = double('server').as_null_object
TCPSocket.stub(:new).and_return(server)

这将允许/忽略传递给TCPSocket.new的任何参数,并忽略传递给该调用返回的对象的所有消息/参数。