我如何在sinatra中设置模拟数据库进行测试?

时间:2012-04-10 22:31:28

标签: rspec mocking sinatra rspec2 neo4j

我有一个使用neo4j作为图形数据库的sinatra应用程序。 该应用程序通过neography作为REST客户端访问数据库。

我想使用rspec模拟此客户端以进行测试。 实现这一目标的最佳做法是什么?

2 个答案:

答案 0 :(得分:2)

找到我的答案:

sinatra app:

require 'sinatra'

module Backend
  class Neography
    # stuff
  end
end

helpers Backend

before do
    @neo = Backend::Neography.new
end

get '/:id' do
  "#{@neo.get_node(params[:id])}"
end

rspec的:

describe 'The App' do
  include Rack::Test::Methods

  def app
    Sinatra::Application
  end

  def mock_neography
    @neo_mock = mock("Backend::Neography")
    @neo_mock.stub!("get_node") {"something else"}
    Backend::Neography.stub(:new).with(any_args()).and_return(@neo_mock)
  end

  it "gets a node" do
    mock_neography
    get '/5'
    last_response.should be_ok
  end
end

答案 1 :(得分:1)

你有几个选择:

一:点击此链接:http://net.tutsplus.com/tutorials/ruby/writing-an-api-wrapper-in-ruby-with-tdd/

它使用webmock和vcr gem逐步解释如何使用它。我们的想法是,您第一次对实时数据库运行测试,vcr记录它们,然后您的测试将用于记录答案。

二:您可以在CI虚拟机环境中针对新数据库运行测试。 看一下Neography的travis.yml文件:

脚本:“捆绑exec rake neo4j:安装neo4j:启动spec --trace”

结果: http://travis-ci.org/#!/maxdemarzi/neography

三:您可以在与您的dev或prod db不同的端口号上运行测试数据库,在您的spec文件中指向neography并使用它。

这是一个很好的问题,所以我会在http://maxdemarzi.com

上的某一天在我的博客上发帖。