ファイル構造

ファイル構造
>The directory structure

`Specs`は普段目的を説明する正規ディレクトリ構造に配置される
>Specs are usually placed in a canonical directory structure that describes their purpose:

モデル仕様書は`spec/models`ディレクトリに属する
>* Model specs reside in the spec/models directory
>* Controller specs reside in the spec/controllers directory

`Request`仕様書は`spec/requests`ディレクトリに属される。ディレクトリはapiまたはインテグレーションと名付けることもできる。
>* Request specs reside in the spec/requests directory. The directory can also be named integration or api.
>* Feature specs reside in the spec/features directory
>* View specs reside in the spec/views directory
>* Helper specs reside in the spec/helpers directory
>* Mailer specs reside in the spec/mailers directory
>* Routing specs reside in the spec/routing directory
>* Job specs reside in the spec/jobs directory
>* System specs reside in the spec/system directory

アプリ開発者は異なるディレクトリ構造を使うため自由に使用することができる。正確な`rspec-rails`サポート機能をインクルードするため、仕様書は適切で一致するメタデータ`:type 値:`を持つことが必要です 
>Application developers are free to use a different directory structure. In order to include the correct rspec-rails support functions, the specs need to have the appropriate corresponding metadata :type value:

モデルの仕様書は type::model
>* Model specs: type: :model
>* Controller specs: type: :controller
>* Request specs: type: :request
>* Feature specs: type: :feature
>* View specs: type: :view
>* Helper specs: type: :helper
>* Mailer specs: type: :mailer
>* Routing specs: type: :routing
>* Job specs: type: :job
>* System specs: type: :system

例えば、`ThingsController`に対する仕様が`spec/legacy/things_controller_spec.rb`に置かれているとします。簡単に仕様書の`RSpec.describe`ブロックに`type: :controller`メタデータをタグ付けする。

>For example, say the spec for the ThingsController is located in spec/legacy/things_controller_spec.rb. Simply tag the spec’s RSpec.describe block with the type: :controller metadata:
```rb
  ​# spec/legacy/things_controller_spec.rb
  RSpec.describe ThingsController, type: :controller do #<-type: :controllerメタデータのタグがついている
    describe "GET index" do
      ​# Examples
    end
  end
```
注意：標準的なRSpecの仕様書は初期値によっていくつかの追加メタデータを必要としない
>Note: Standard RSpec specs do not require any additional metadata by default.

詳細ついては、メタデータの使用するには`rspec-core`ドキュメントを確かめて下さい
>Check out the rspec-core documentation on using metadata for more details.

自動的にメタデータの追加
>#### Automatically Adding Metadata

3.0.0より前のRSpecバージョンは自動的にファイルシステム上の位置に基づいて仕様書にメタデータを自動的に追加するこれは新しいユーザーも混乱させ、ベテランのユーザーに対しても望ましくない。
>RSpec versions before 3.0.0 automatically added metadata to specs based on their location on the filesystem. This was both confusing to new users and not desirable for some veteran users.

この振る舞いは明示的に有効にしなければならない
>This behaviour must be explicitly enabled:
```rb
  ​# spec/rails_helper.rb
  RSpec.configure do |config|
    config.infer_spec_type_from_file_location!
  end
```
想定された振る舞いはチュートリアルでとても一般的に行われているので、`rails generate rspec:install`で生成された初期の構成はこれが可能である。
>Since this assumed behavior is so prevalent in tutorials, the default configuration generated by rails generate rspec:install enables this.

もし上のリスト化された正規ディレクトリ構成に従い、`infer_spec_type_from_file_location!`を構成したのならば、RSpecはそれぞれのタイプに対して正確なサポート機能を自動的に含むだろう。
>If you follow the above listed canonical directory structure and have configured infer_spec_type_from_file_location!, RSpec will automatically include the correct support functions for each type.

上記の正規構造に合わないカスタム・ディレクトリにメタデータを設定したい場合、次のことができる。
>If you want to set metadata for a custom directory that doesn’t follow fit the canonical structure above, you can do the following:
```rb
  ​# set `:type` for serializers directory
  RSpec.configure do |config|
    config.define_derived_metadata(:file_path => Regexp.new('/spec/serializers/')) do |metadata|
      metadata[:type] = :serializer
    end
  end
```
仕様書の位置のコツ
>#### Tips on Spec Location
`sepc/`ディレクトリ構造は一般的に`app/`と`lib/`を両方反映することを提案する。これにより対応するコードとspecファイルを簡単に確認できる。
>It is suggested that the spec/ directory structure generally mirror both app/ and lib/. This makes it easy to locate corresponding code and spec files.


標準的なrailsの仕様書は`:type`メタデータを明示しなければならない
>### Standard Rails specs must specify the :type metadata
```rb
require "rails_helper"

RSpec.describe WidgetsController, type: :controller do
  it "responds successfully" do
    get :index                         # httpリクエストも遅れる
    expect(response.status).to eq(200) # httpステータスも検査することができるらしい
  end
end
```
railsと関係ない仕様書は初期値によって`:type`メタデータを必要としない
>### Non-rails related specs do not require :type metadata by default
```rb
require "spec_helper"

Entry = Struct.new(:description, :us_cents)

RSpec.describe Entry do
  it "has a description" do
    is_expected.to respond_to(:description) # 
  end
end
```

ファイルの位置から仕様書のタイプを推測し、適切なメタデータを加える
>### Inferring spec type from the file location adds the appropriate metadata

```rb
require "rails_helper"

RSpec.configure do |config|
  config.infer_spec_type_from_file_location!
end

RSpec.describe WidgetsController do
  it "responds successfully" do
    get :index
    expect(response.status).to eq(200)
  end
end
```

https://rspec.info/features/6-0/rspec-rails/directory-structure/