从测试/规范或其他ruby脚本启动sinatra

时间:2014-10-02 10:56:06

标签: ruby rspec sinatra

我正在尝试,我正在尝试从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,但我想知道我是否可以设法以这种方式进行测试。

2 个答案:

答案 0 :(得分:1)

在RSpec上查看“Testing Sinatra with Rack::Test”。我建议你使用该代码作为样板来开始。

只需将其添加到您的describe块:

def app
  Sinatra::Application
end

我建议你阅读RSpec。


由于您希望通过评论的外观测试外部系统,而不是system "curl whatewer.com",您可以使用Net :: HTTP发出请求,然后针对响应进行测试。

查看“Testing an external API using RSpec's request specs”。

答案 1 :(得分:0)

由于我正在编写请求规范以确保功能不会被破坏,所以我决定更好地编写单独的Cucumber功能。好消息是我可以使用Capybara,并且感谢Selenium Web Drive,我可以在运行测试之前启动服务器。

因此,我创建了一个虚拟的Sinatra应用程序(它将代表我正在测试的实际代码正在执行请求的外部服务(包括令人讨厌的system('curl whatever.com'))。

我所要做的就是将传递给curl的方法固定下来以使用Capybara.current_session.server.hostCapybara.current_session.server.port

一旦我完成了我的重新分解,我所要做的就是从黄瓜/水豚配置中删除Capybara服务器变量和Selenium web驱动器。

短暂更改后的测试仍然有效,并且有效。

<强>更新

最后我用RSpec请求测试写了所有内容,因为在Cucumber中这样做有点费时,我已经花了太多时间在这上面。

我使用RSpec标记标记这些请求测试,在我午餐之前,我手动午餐请求的简单Sinatra / Grape虚拟API应用程序。 (然后我用这个标签运行RSpec测试)

所以基本上我最终得到的功能规格是使用net / http使用WebMock并且不需要服务器,并且在运行规范之前请求测试我需要运行服务器。 所以最初的问题仍然存在,如何在测试开始前午餐服务器

在我介绍了所有功能之后,我将gonig重写为net / http,但是我会保留这些请求规格,因为我发现它们在疯狂的API场景中是个好主意(比如测试https + diggested authentication)

相关问题