我知道这不是一个真实或错误的问题,但这是我想要解决的问题。我正在开发一个与SoftEther VPN Server交互的rails web应用程序。
SoftEther不提供API,但它有一个命令行管理工具(vpncmd),它可以处理我需要做的所有任务。起初我试图依赖rake任务并直接调用命令行工具,但当我尝试为它们编写一些测试时,我意识到这不是最好的选择。
现在我正在写一个wrapper class我可以正确测试。问题我仍然不知道如何处理服务器呼叫。
一些方法,如" create_user!"应该通过确认在服务器中创建了一个新用户来验证,为此可以,我当前可以运行一个运行实际的PacketiX VPN Server实例的docker容器。在我的rspec文件的开头,在before_all挂钩内创建了一个新容器,并在after_all挂钩的末尾销毁了该容器。
我的解决方案有什么不好吗?如果是,那么TDD的做法是什么呢?
提前致谢,
答案 0 :(得分:0)
有几个选项可供您使用。首先,我只想提一下,你可以在没有包装器的情况下测试你的rake任务。以下是一篇很好的文章:https://robots.thoughtbot.com/test-rake-tasks-like-a-boss。
现在回答你的问题。就个人而言,我会mock or stub对调用外部服务的方法的响应。要做到这一点,您只需记录一个成功的呼叫/响应到您的api,然后使用以下方法将其删除:
allow_any_instance_of(Object).to receive(:foo).and_return(:return_value)
如果Object是您的类,则Foo是您的方法,并且:return_value是return_value。
您在短期内可能更容易的另一个选择是使用VCR gem。如果没有卡带存在,录像机基本上记录您的请求和服务的响应(卡带基本上是记录的响应)。如果存在录像带,录像机将阻止您的应用程序拨打外部电话,并将简单地播放先前录制的录像带上的响应。我很喜欢录像机,但它有一个学习曲线,如果你从来没有使用它,它可以带来其公平的头痛。如果您仍然感到困惑,请随意发布一些您遇到问题的示例代码,我会尽力让您继续前进。