vscodeでRSpec

覚え書き

# エディタ
・VScode

# 手順
作業ディレクトリを作る
↓

```
    $ bundle init
```
↓
rspecのジェムを読み込む

```Gemfile.
# gem 'rails'
gem 'rspec'
```
↓

```
    $ bundle install --path vendor/bundle
```
↓
テストされるコードを置くフォルダ(例：libフォルダ)
と、テストコードを置くフォルダを作る(specフォルダ)

#### FizzBuzz テストされるフォルダ
```first.rb
class FizzBuzz

    def get_fizz_buzz_text(number)
      if number == 15 || number == 30
        "FizzBuzz"
      elsif number % 5 == 0
        "Buzz"
      elsif number % 3 == 0
        "Fizz"
      else
        number.to_s
      end
    end
  end
```
#### FizzBuzz　テストコードを置くフォルダ

```first_spec.rb
RSpec.describe FizzBuzz do
  let(:fizz_buzz) { FizzBuzz.new }
    it "1の時1が来る" do
      result = fizz_buzz.get_fizz_buzz_text(1)
      expect(result).to eq "1"
    end
  end
end
```

#  bundle exec rspec テスト実行

```
    $ bundle exec rspec
```

```
An error occurred while loading ./spec/first_spec.rb.
Failure/Error: require 'spec_helper'

LoadError:
  cannot load such file -- spec_helper
```
'spec_helper'が必要

# rspecのhelper
specフォルダ(テストデータのあるフォルダの中)に、spec_helper.rbというファイルを作って中にコピペする
こういった内容を他のテストファイルで読み込めればいいので名前はなんでもいいはず。
specのhelperということなのでspecが含まれる（？）ファイルのテストコードを動かす力を持っている(?)という理解
`ruby_spec1.rb`や`qiitaspec.rb`とかいうファイルは動かないが
`aaaaaaaa_spec.rb`はうごく

```spec_helper.rb
RSpec.configure do |config|
  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.mock_with :rspec do |mocks|
    mocks.verify_partial_doubles = true
  end

  config.shared_context_metadata_behavior = :apply_to_host_groups
  config.filter_run_when_matching :focus

  config.example_status_persistence_file_path = "spec/examples.txt"

  config.disable_monkey_patching!

  config.warnings = true

  if config.files_to_run.one?
    config.default_formatter = "doc"
  end

  config.profile_examples = 10

  config.order = :random

  Kernel.srand config.seed
  Dir[File.join(File.dirname(__FILE__), "../lib/**/*.rb")].each { |f| require f }
end
```

## FizzBuzz テストコード 完成
```first_spec.rb
require 'spec_helper'

RSpec.describe FizzBuzz do
  let(:fizz_buzz) { FizzBuzz.new }
  context 'その他のとき' do
    it "1の時1が来る" do
      expected = "1"
      result = fizz_buzz.get_fizz_buzz_text(1)
      expect(result).to eq expected
    end
  end
  context '3の倍数のとき' do
    let(:fizz_test_cases) do
      [ 3, 6 ]
    end
    it "3の時Fizzが来る" do
      expected = "Fizz"
      fizz_test_cases.each do |test_case|
        result = fizz_buzz.get_fizz_buzz_text(test_case)
        expect(result).to eq expected
      end
    end
  end
  context '5の倍数のとき' do
    let(:buzz_test_cases) do
      [ 5, 10 ]
    end
    it "5の時Buzzが来る" do
      expected = "Buzz"
      buzz_test_cases.each do |test_case|
        result = fizz_buzz.get_fizz_buzz_text(test_case)
        expect(result).to eq expected
      end
    end
  end
  context '3と5の倍数のとき' do
    it "15の時FizzBuzzが来る" do
      result = fizz_buzz.get_fizz_buzz_text(15)
      expected = "FizzBuzz"
      expect(result).to eq expected
    end
    it "30の時FizzBuzzが来る" do
      result = fizz_buzz.get_fizz_buzz_text(30)
      expected = "FizzBuzz"
      expect(result).to eq expected
    end
  end
end
```

#  bundle exec rspec
結果

```

Randomized with seed 28943
.....
Top 5 slowest examples (0.00164 seconds, 14.8% of total time):
  FizzBuzz 5の倍数のとき 5の時Buzzが来る
    0.00124 seconds ./spec/first_spec.rb:28
  FizzBuzz 3と5の倍数のとき 15の時FizzBuzzが来る
    0.00012 seconds ./spec/first_spec.rb:37
  FizzBuzz その他のとき 1の時1が来る
    0.0001 seconds ./spec/first_spec.rb:6
  FizzBuzz 3と5の倍数のとき 30の時FizzBuzzが来る
    0.00009 seconds ./spec/first_spec.rb:42
  FizzBuzz 3の倍数のとき 3の時Fizzが来る
    0.00009 seconds ./spec/first_spec.rb:16

Finished in 0.01108 seconds (files took 0.15655 seconds to load)
5 examples, 0 failures

Randomized with seed 28943
```

thank you にゃー