2013-03-02 11 views
98

Rspecのfeature specsrequest specsの概念の違いは何ですか?機能仕様のドキュメントからRSpec:機能と要求仕様の違いは何ですか?

機能のスペックは、アプリケーションを介して機能 のスライスを行使することを意味し、高レベルのテストです。彼らは外部のインターフェイス、通常はウェブページ を介してのみアプリケーションを駆動する必要があります。

と要求仕様のために:

要求スペックがRailsの統合テストの周りに薄いラッパーを提供し、(レールによって提供される) ルーティングを含む、完全なスタックを介して動作を駆動するように に設計されており、スタブすることなく(それはあなた次第です)。要求スペックで は、あなたがすることができます

  • 複数のセッションをまたいで複数の要求を指定
  • 複数のコントローラ間で複数の要求を指定する単一の要求を指定

私はその機能の仕様を使用して知っていますCapybaraと要求仕様では一致しません。しかし、それは異なる概念にはほとんど当てはまりません。

答えて

134

概念上の違いは、通常、ユーザーストーリーをテストしていることであり、すべての対話はユーザーインターフェイスを使用して実行する必要があります。それはCapybaraが入ってくる場所です。依頼仕様は依然としてアプリケーションの動作をテストしており、受け入れテストが持つ可読性は期待できません。したがって、アクセプタンステストの構文が改善されていることが特徴です。

技術仕様には要求仕様書が含まれていますが、Railsの統合テストはフィーチャー仕様ではありません。これはリクエスト仕様では、get、post、put、delete、responseに対してメソッドを使用できることを意味します。機能仕様では、ブラウザを介してすべての対話を駆動し、訪問やページに対するアサートなどの方法を使用する必要があります。

githubのrspec-railsソースコードのfeature_spec.featureを読むことをお勧めします。私はこれが役立つことを願っています

+2

フィーチャー仕様とリクエスト仕様の両方を使用することをお勧めしますか、それとも十分ですか? (TDDを初めて使っている...) – robertwbradford

+2

私は@robertwbradfordの両方を使用しています。フィーチャー・スペックを使用して、テストで自分の外部を運転する - ユーザー・エクスペリエンスをテストし、単体テストを使用して機能を構築する。応答をテストするためにリクエスト仕様を使用します。 sessions_specでは 'expect(response.status).to eq(200)'や 'expect(response).to render_template(:)のような' it'ブロックに期待通りのGET/loginブロックを記述しているかもしれません。 '' POST /セッション ''、 ''予想(応答).to redirect_to(ユーザ) ''とfollow_redirect! expect(response.body).to include( "Signed in") ' –

+5

あなたはコントローラ仕様も使用していますか?要求仕様でテストするものとコントローラの仕様で通常テストされるものとの間には重複があるようです。 – Ernesto