aroundフックの特徴

### exampleをブロック処理の引数とする
aroundフックはprocとして振る舞うことを拡張したブロックの引数としてexampleを受理する。これによりあなたはexampleの前後に実行されるべきコードを定義する。もちろん、あなたはフックの前後で同じことができる。そしてその方がスッキリする方が多い。
>around hooks receive the example as a block argument, extended to behave as a proc. This lets you define code that should be executed before and after the example. Of course, you can do the same thing with before and after hooks; and it’s often cleaner to do so.

#### around()へ渡されたブロック内のprocとしてexampleを使う
>### Use the example as a proc within the block passed to around()

```rb
class Database
  def self.transaction
    puts "open transaction"
    yield
    puts "close transaction"
  end
end

RSpec.describe "around filter" do
  around(:example) do |example|
    Database.transaction(&example)
  end

  it "gets run in order" do
    puts "run the example"
  end
end
```
```
open transaction
run the example
close transaction
1 example, 0 failures, 1 passed
```
* procに関しては後から勉強するとして流れてとしてはexampleが実行されるたびに呼び出せるみたいだ。

```rb
RSpec.describe "around filter" do
  around(:example) do |example|
    Database.transaction(&example)
  end

  it "gets run in order" do
    puts "run the example"
  end

  it "gets run in order" do
    puts "run the example"
  end
end
```
```
Run options: include {:full_description=>/around\ filter/}
open transaction
run the example
close transaction
open transaction
run the example
close transaction
2 examples, 0 failures, 2 passed
```
#### `run()`を使ってexampleを発動する
>### Invoke the example using run()
Given a file named “example_spec.rb” with:
```rb
RSpec.describe "around hook" do
  around(:example) do |example|
    puts "around example before"
    example.run
    puts "around example after"
  end

  it "gets run in order" do
    puts "in the example"
  end
end
```
```
around example before
in the example
around example after
1 example, 0 failures, 1 passed
```
#### メタデータでexampleにアクセスする
>### Access the example metadata
Given a file named “example_spec.rb” with:
```rb
RSpec.describe "something" do
  around(:example) do |example|
    puts example.metadata[:foo]
    example.run
  end

  it "does something", :foo => "this should show up in the output" do
  end
```
```
this should show up in the output
1 example, 0 failures, 1 passed
```
* メタデータの文字列を表示させている

#### `around`フックはたとえexampleが例外を投げたとしても実行を続ける
>### An around hook continues to run even if the example throws an exception

```rb
  RSpec.describe "something" do
    around(:example) do |example|
      puts "around example setup"
      example.run
      puts "around example cleanup"
    end

    it "still executes the entire around hook" do
      fail "the example blows up"
    end
  end
```
```
around example setup
around example cleanup

RuntimeError: the example blows up
...
1 example, 1 failure, 0 passed
```
#### グローバルな`around`フックを定義する
>### Define a global around hook
Given a file named “example_spec.rb” with:
```rb
RSpec.configure do |c|
  c.around(:example) do |example|
    puts "around example before"
    example.run
    puts "around example after"
  end
end

RSpec.describe "around filter" do
  it "gets run in order" do
    puts "in the example"
  end
end
```
```
around example before
in the example
around example after
1 example, 0 failures, 1 passed
```
* グループが違っても実行できる

#### exampleごとのフックは`around`フックよにって包まれる
>### Per example hooks are wrapped by the around hook

```rb
RSpec.describe "around filter" do
  around(:example) do |example|
    puts "around example before"
    example.run
    puts "around example after"
  end

  before(:example) do
    puts "before example"
  end

  after(:example) do
    puts "after example"
  end

  it "gets run in order" do
    puts "in the example"
  end
end
```
```
around example before
before example
in the example
after example
around example after
1 example, 0 failures, 1 passed
```
#### contextのフックは`around`フックによって包まれない
>### Context hooks are NOT wrapped by the around hook

```rb
RSpec.describe "around filter" do
  around(:example) do |example|
    puts "around example before"
    example.run
    puts "around example after"
  end

  before(:context) do
    puts "before context"
  end

  after(:context) do
    puts "after context"
  end

  it "gets run in order" do
    puts "in the example"
  end
end
```
```
before context
around example before
in the example
around example after
after context
1 example, 0 failures, 1 passed
```
https://rspec.info/features/3-13/rspec-core/hooks/around-hooks/