neo4jをグラフdbとして使用するsinatraアプリがあります。アプリはneographyを介してRESTクライアントとしてデータベースにアクセスします。
rspec を使用して、テスト目的でこのクライアントをモックしたいと考えています。これを達成するためのベストプラクティスは何ですか?
私の答えを見つけました:
シナトラアプリ:
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: このリンクに従ってください: http://net.tutsplus.com/tutorials/ruby/writing-an-api-wrapper-in-ruby-with-tdd/
Webmock と vcr gem を使用してそれを行う方法を順を追って説明します。アイデアは、最初にライブデータベースに対してテストを実行し、vcr がそれらを記録し、その後、記録された回答からテストが実行されるというものです。
2: CI 仮想マシン環境で新しいデータベースに対してテストを実行できます。Neography の travis.yml ファイルを見てみましょう。
スクリプト: "bundle exec rake neo4j:install neo4j:start spec --trace"
結果: http://travis-ci.org/#!/maxdemarzi/neography
3: dev または prod db とは異なるポート番号で test db を実行し、neography を spec ファイル内のポート番号に向けて、それを使用することができます。
これは良い質問なので、近日中に http://maxdemarzi.comのブログに投稿します。