RSpec:機能と要求仕様の違いは何ですか?


113

Rspecの機能仕様リクエスト仕様の概念的な違いは何ですか?

機能仕様ドキュメントから:

機能仕様は、アプリケーションを通じて機能のスライスを実行することを目的とした高レベルのテストです。彼らは通常、外部インターフェイス(通常はWebページ)を介してのみアプリケーションを駆動する必要があります。

そしてリクエスト仕様について:

要求仕様は、Railsの統合テストの薄いラッパーを提供し、ルーティング(Railsによって提供される)やスタブなし(ユーザー次第)など、フルスタック全体で動作を駆動するように設計されています。リクエスト仕様を使用すると、次のことができます。

  • 単一のリクエストを指定する
  • 複数のコントローラーにまたがる複数のリクエストを指定する
  • 複数のセッションにわたって複数のリクエストを指定する

機能仕様はカピバラを使用し、要求仕様は使用しないことを知っています。しかし、それは異なる概念にほとんどメリットがありません。

回答:


147

概念的な違いは、通常はユーザーストーリーをテストすることであり、すべての操作はユーザーインターフェースを介して行う必要があります。そこで登場するのがCapybaraです。リクエストスペックはまだアプリケーションの動作をテストしており、受け入れテストのような読みやすさの期待はありません。したがって、受け入れテストの構文を改善するための機能があります。

技術的な違いには、要求仕様がRails統合テストをラップするのに対して、機能仕様はそうではありません。つまり、リクエストスペックでは、メソッドget、post、put、delete、および反アサートを使用できます。機能仕様では、ブラウザを介したすべての対話を促進し、訪問やページに対するアサートなどのメソッドを使用する必要があります。

githubのrspec-railsソースコードにあるfeature_spec.featureを読むことをお勧めします。これがお役に立てば幸いです。


2
では、機能仕様とリクエスト仕様の両方を使用することをお勧めしますか、それともどちらかで十分ですか?(TDDの新機能...)
robertwbradford 2014年

2
@robertwbradfordの両方を使用します。私は機能仕様を使用して、テストで外部を動かします-ユーザーエクスペリエンスをテストしてから、単体テストを使用して機能を構築します。私は応答をテストするための要求仕様を使用-などでA sessions_spec私が記述している可能性"GET /login"で期待にブロックをitのようなブロックexpect(response.status).to eq(200)expect(response).to render_template(:new)、またはでdescribe "POST /sessions"context "with valid credentials"で、ブロックをexpect(response).to redirect_to(user)してfollow_redirect!; expect(response.body).to include("Signed in")
リチャード・ジョーダン

5
また、コントローラの仕様も使用していますか?リクエスト仕様でテストするものと、コントローラー仕様で通常テストするものとの間には、少し重複があるようです。
Ernesto

5
それを言って、上記のリンクされた投稿は違いを明確に説明しています。リクエスト仕様を使用してAPI経由でテストし、機能仕様を使用してフロントエンド経由でテストします。
Damien Roche

2
@RichardJordan:質問:機能仕様では、Railsパス(つまりvisit users_path)またはハードコードされた文字列(visit '/users')を使用することをお勧めしますか?個人的には、そのような仕様ではアプリの内部を使用しないことを好みます。
tokland
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.