【问题标题】:How should I mock a UDP server using RSpec? (New Ruby programmer.)我应该如何使用 RSpec 模拟 UDP 服务器? (新的 Ruby 程序员。)
【发布时间】:2013-10-10 13:20:11
【问题描述】:

伙计们!

我是 Ruby 开发的新手,我正在使用该语言开发我的第一个项目。在与我的朋友讨论后,我在我的第一个实际项目中使用了测试驱动开发方法,但我在早期遇到了一些障碍。

我的项目的主要目的是处理 Source-Engine 专用游戏服务器,我对模拟不太了解,这是我应该做的事情,而不是我的测试依赖于周围的实际服务器用来测试东西。

所以我的问题是:当我需要测试向服务器发送响应并获得正确响应时,我应该如何模拟 UDP 服务器?

例如引用此文档时:https://developer.valvesoftware.com/wiki/Server_queries#A2S_SERVERQUERY_GETCHALLENGE

在给定挑战请求的情况下,我想测试挑战编号的获取。我有点不确定如何继续。

任何帮助将不胜感激并且非常有用。如果我要完成这件事,我希望在第一时间把事情做好,而不是养成任何我以后不得不改掉的坏习惯。

【问题讨论】:

  • 我是否应该在我的测试规范中创建本地 UDP 服务器并使用 before/after 将其拆除?这让我想到:stackoverflow.com/questions/14555249/…
  • 您是否使用EventMachine 或类似的东西来运行您的服务器?它可以使测试更复杂,但它提供了更好的执行框架。
  • 我什至不知道那是什么。我有点磕磕绊绊,只是想在我前进的过程中弄清楚事情。
  • 值得研究。编写自己的事件循环结构来处理 UDP 服务很麻烦,而 EventMachine 可以大大简化您的设计。查看如何实现 DNS 服务器的示例以获得想法。
  • 是的,基本上我需要模拟游戏服务器对 UDP 消息的响应。具体来说,我的图书馆要发送东西,我需要让它发回某些东西,并确保图书馆正确读取响应等。

标签: ruby unit-testing rspec mocking udp


【解决方案1】:

这里有一些伪代码可以帮助你入门

describe 'I should get a challenge response when sending a request' do
    socket = mock('UDPSocket').as_null_object

    challenge_request = [0xFF, 0xFF, 0xFF, 0xFF, 0x57]
    expected_response = [0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0x4B, 0xA1, 0xD5, 0x22]

    socket.should_receive(:send_request).with(challenge_request).and_respond_with(expected_response)

    authentication_engine = new AuthenticationEngine(socket)
    authentication_engine.issue_challenge_request
end

这里的要点是,您正在定义您的预期请求和响应应该是什么,创建一个模拟 UDP 套接字,您可以将其注入任何将发送挑战并期待响应的内容,然后调用发出的功能那个挑战。

authentication_engine 应该知道它需要通过其socket 发送质询请求,并且需要从该套接字获得响应。

should_receive 期望告诉 rspec,authentication_engine.issue_challenge_request 的调用应该导致套接字接收对方法 send_request 的调用,参数为 challenge_request,如果发生这种情况,它应该以预期的响应进行响应expected_response

这假设您以模块化方式编写代码,允许您以这种方式注入依赖项。

通过一些关于您可用的各种 rspec 期望的教程来学习可能对您有利。

【讨论】:

  • 是的。一般来说,我真的没有读过很多关于 RSpec 的内容。这可能对我没有任何帮助。
猜你喜欢
  • 2013-10-23
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多