2016-08-07 7 views
1

私のアプリのテストを解決する必要があります。 MongoDB(rescue Mongo::Error::NoServerAvailable => _e)への接続を評価し、エラーをレンダリングする一連のコードについては、不平を言っています。私はRSpecでMongo接続エラー処理をテストするには

.and_raise(IOError) 
を使用する必要があることがわかった

it 'should return an exception' do 
    get :index 
    expect(response).to raise_exception 
end 

:私のようなものをテストしようとしています

def index 
    render json: Complex.all.to_json 
rescue Mongo::Error::NoServerAvailable => _e 
    render json: { error_description: 'no database available' }, status: 503 
end 

:あなたは、私はこれをテストするために使うべきだと思います

しかし、私はそれが行に落ちるためにそれをどこで使用するかわかりません。 実際にモンゴを止めれば例外になるかもしれませんが、それは考えていません。

お時間をいただきありがとうございます。

+0

@DaveSchweisguthこれまであまり運がなかった。 私はexpect(response).to raise_exceptionでテストする必要があることを知っています。 罰金はありますが、レスキューエラーに陥るような行動を起こすことはありません。 レスキューMongo :: Error :: NoServerAvailable => _e – moplin

答えて

1

例外を処理するコード行に到達するには、例外を発生させるためにComplex.all.to_jsonをスタブします。 Complex.all.jsonがチェーンされているので、それをスタブするために少し余分な努力が必要です。また、例外が処理されるため、発生したことをテストできません。代わりに、それを処理した結果をテストします。

it 'should handle the exception' do 
    all = double 
    allow(all).to receive(:to_json).and_raise Mongo::Error::NoServerAvailable 
    allow(Complex).to receive(:all).and_return all 
    get :index 
    expect(response.status).to eq(503) 
    expect(response.body).to include('no database available') 
    # you could test the JSON more thoroughly, but you get the idea 
end 

あなたはより少ないコードでComplex.all.to_jsonをスタブにしreceive_message_chainを使用することができます。私は長いバージョンを使用しました。なぜなら、何が起こっているのか理解しやすいからです。

+0

おかげで多くの仲間。 私はそれを動作させるために少ししました。しかしそれは助けになった。 – moplin

+0

将来の嘲笑者のための詳細を自由に追加してください。私たちのどちらでも私たちの投稿を更新できます。 –

関連する問題