pendingしてからコミットpushしよう 〜RSpecしぐさ〜


この記事は[Okinawa.rb Advent Calendar 2018](https://qiita.com/advent-calendar/2018/okinawarb)の5日目の記事です。
昨日は @hanachin_ さんの[TracePointのenable(target: )は戻り値を書き換えるときべんり](https://qiita.com/hanachin_/items/d5e243048900344b2146)でした。
明日は @hanachin_ さんの[refineをしてるモジュール取り出せるrefinements_robbery gem](https://qiita.com/hanachin_/items/20c1b77936962ee07a7d)です。

## red/green/refactor :red_circle: :green_heart: :purple_heart:

所轄こういうやつです

1. red: あんなこといいな、できたらいいな ＞できない＜
2. green: ＞できた＜
3. refactor: ＞上手にできた＜

## pendingの心

redを書いてもテストが落ちない優しい機能、それがpending

## 最後にテスト書いたら絶対落ちない説

テスト絶対落としたくないから先に実装しちゃおう。

ッシャ、実装かけた!!!


```rb:/tmp/pending.rb
using Module.new {
  refine(Object) {
    def pleasure?
      true
    end
  }
}
```

テストかこ

```rb:/tmp/pending.rb
using Module.new {
  refine(Object) {
    def pleasure?
      true
    end
  }
}

RSpec.describe "usingをキメると気持ちいい" do
  it { is_expected.to be }
end
```

テストしよ

```console
% rspec /tmp/pending.rb
.

Finished in 0.00275 seconds (files took 0.08694 seconds to load)
1 example, 0 failures
```

通った⤴⤴⤴

コミットしてpushしとこ

```
% git add .
% git commit -m "通った⤴⤴⤴"
% git push
```

ワンチャン実装ミスってるかもしれないから試しにコメントアウトしてテストしよ

```rb:/tmp/pending.rb
using Module.new {
  refine(Object) {
    def pleasure?
      # true
    end
  }
}

RSpec.describe "usingをキメると気持ちいい" do
  it { is_expected.to be }
end
```

＞0 failures＜

```console
% rspec /tmp/pending.rb
.

Finished in 0.00275 seconds (files took 0.08998 seconds to load)
1 example, 0 failures
```

なにこのテスト絶対落ちないじゃん。。。
もうpushしちゃった。。。
force pushしよ。。。

## 落ちるテストコミットすると絶対落ちる説

こないだ絶対落ちないテスト書いちゃったから絶対落とそう。

ッシャ、テスト書けた!!!

```rb:/tmp/pending.rb
RSpec.describe "usingをキメると気持ちいい" do
  subject { self.pleasure? }
  it { is_expected.to eq(true) }
end
```

テストしよ

```console
% rspec /tmp/pending.rb
F

Failures:

  1) usingをキメると気持ちいい
     Failure/Error: subject { self.pleasure? }

     NoMethodError:
       undefined method `pleasure?' for #<RSpec::ExampleGroups::Using "example at ./pending.rb:3">
     # ./pending.rb:2:in `block (2 levels) in <top (required)>'
     # ./pending.rb:3:in `block (2 levels) in <top (required)>'

Finished in 0.0018 seconds (files took 0.08667 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./pending.rb:3 # usingをキメると気持ちいい
```

テスト通るまで待て的な?

```
% git checkout -b pleasure
% git add .
% git commit -m "テスト通るまで待て的な?"
```

カタカタカタ、ッシャ、テスト通った! マージしよ

```
% git add .
% git commit -m "よき"
% git checkout master
% git merge pleasure
```

〜チェックアウトすると絶対に落ちるコミットが永遠に残った（完）〜

## おとなたちに伝えたいpendingの心

ッシャ、テスト書けた!!!

```rb:/tmp/pending.rb
RSpec.describe "usingをキメると気持ちいい" do
  subject { self.pleasure? }
  pending { is_expected.to eq(true) }
end
```

テストしよ

```
% rspec /tmp/pending.rb
*

Pending: (Failures listed here are expected and do not affect your suite's status)

  1) usingをキメると気持ちいい
     # No reason given
     Failure/Error: subject { self.pleasure? }

     NoMethodError:
       undefined method `pleasure?' for #<RSpec::ExampleGroups::Using "example at ./pending.rb:3">
     # ./pending.rb:2:in `block (2 levels) in <top (required)>'
     # ./pending.rb:3:in `block (2 levels) in <top (required)>'

Finished in 0.00186 seconds (files took 0.08631 seconds to load)
1 example, 0 failures, 1 pending
```

実装されてNASA

```
% git checkout -b add_pleasure_test
% git add .
% git commit -m 'テストを追加した'
```

とりまテスト書いたんでマージしまーーーす、0 failuresでーーーす。

```
% git checkout master
% git merge add_pleasure_test
```

カタカタカタ、ッシャ、実装できた

```rb:/tmp/pending.rb
using Module.new {
  refine(Object) {
    def pleasure?
      true
    end
  }
}

RSpec.describe "usingをキメると気持ちいい" do
  subject { self.pleasure? }
  pending { is_expected.to eq(true) }
end
```

テストしよ

```
% rspec /tmp/pending.rb
F

Failures:

  1) usingをキメると気持ちいい should eq true FIXED
     Expected pending 'No reason given' to fail. No error was raised.
     # ./pending.rb:11

Finished in 0.00213 seconds (files took 0.08681 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./pending.rb:11 # usingをキメると気持ちいい should eq true
```

エラー出てないのに落ちてて草www

itおかしwww


```rb:/tmp/pending.rb
using Module.new {
  refine(Object) {
    def pleasure?
      true
    end
  }
}

RSpec.describe "usingをキメると気持ちいい" do
  subject { self.pleasure? }
  it { is_expected.to eq(true) }
end
```

itに書き換えおけまる水産、テストしよ

```console
% rspec /tmp/pending.rb
.

Finished in 0.00204 seconds (files took 0.08792 seconds to load)
1 example, 0 failures
```

結果にコミット

```console
% git add .
% git commit -m "気持ちいいいいい"
% git push
```


## まとめ

どのコミットをチェックアウトしてもテストが通る、それがRSpecしぐさ、pendingの心。

テストだけ
コミットするなら
pending

では。