我正在尝试,我正在尝试从RSpec启动虚拟Sinatra应用程序并在规范完成后终止它。类似的东西:
# spec/some_spec.rb
before(:all)
# launch sinatra dummy app
end
after (:all)
# kill sinatra dummy app
end
it 'should return list of whatever' do
expect(JSON.parse(make_request('0.0.0.0:4567/test.json')))
.to include('whatever')
end
我可以使用system("ruby test/dummy/dummy_app.rb")
,但我怎样才能杀死这个进程?有谁知道如何在测试中(或从另一个ruby脚本)启动Sinatra?我知道WebMocks,但我想知道我是否可以设法以这种方式进行测试。
答案 0 :(得分:1)
在RSpec上查看“Testing Sinatra with Rack::Test”。我建议你使用该代码作为样板来开始。
只需将其添加到您的describe块:
def app
Sinatra::Application
end
我建议你阅读RSpec。
由于您希望通过评论的外观测试外部系统,而不是system "curl whatewer.com"
,您可以使用Net :: HTTP发出请求,然后针对响应进行测试。
答案 1 :(得分:0)
由于我正在编写请求规范以确保功能不会被破坏,所以我决定更好地编写单独的Cucumber功能。好消息是我可以使用Capybara,并且感谢Selenium Web Drive,我可以在运行测试之前启动服务器。
因此,我创建了一个虚拟的Sinatra应用程序(它将代表我正在测试的实际代码正在执行请求的外部服务(包括令人讨厌的system('curl whatever.com')
)。
我所要做的就是将传递给curl的方法固定下来以使用Capybara.current_session.server.host
和Capybara.current_session.server.port
。
一旦我完成了我的重新分解,我所要做的就是从黄瓜/水豚配置中删除Capybara服务器变量和Selenium web驱动器。
短暂更改后的测试仍然有效,并且有效。
<强>更新强>
最后我用RSpec请求测试写了所有内容,因为在Cucumber中这样做有点费时,我已经花了太多时间在这上面。
我使用RSpec标记标记这些请求测试,在我午餐之前,我手动午餐请求的简单Sinatra / Grape虚拟API应用程序。 (然后我用这个标签运行RSpec测试)
所以基本上我最终得到的功能规格是使用net / http使用WebMock并且不需要服务器,并且在运行规范之前请求测试我需要运行服务器。 所以最初的问题仍然存在,如何在测试开始前午餐服务器
在我介绍了所有功能之后,我将gonig重写为net / http,但是我会保留这些请求规格,因为我发现它们在疯狂的API场景中是个好主意(比如测试https + diggested authentication)