header image
header image

一段上のエンジニアに。Rails でテストコードを書く ( RSpec )

一段上のエンジニアに。Rails でテストコードを書く ( RSpec )

 

昨今TDDなどもあり、 テストコードについての話題がありますが、

 

個人的にテストコードが書ける人 = 初級者を脱した中級者 のようなイメージを持っています。

 

打たれる前に打てというような 考えもあるかと思いますが、 打たれても大丈夫なように体を作ることも大事です。

ちょっと何を言いたいのかわかりませんが 野球もサッカーも守りが強いという土台の上でこそ 攻撃力や創造性が発揮されるということです。

ということで脱線しましたが、 簡単な導入から行きましょう。

 

まずはアプリはこんな感じです。

calculator.png

はい、簡単な足し算をするアプリです。 viewのコードは以下です。 viewcode.png

 

bootstarap で多少装飾していますが、 今回はここで呼んでいる addというメソッドのテストを書いてみます。

まずはインストールから 方法はここにあります。 https://github.com/rspec/rspec-rails

ということで

gem 'rspec-rails', '~> 3.5'

を追記してからbundle installします。

インストールできたら初期化

rails generate rspec:install

テストの実行方法は以下です。

# モジュール単位
bundle exec rspec spec/[ models / helpers / controller / .. ]

# ファイル単位
bundle exec rspec spec/helpers/homes_helper_rspec.rb
</code></pre class="ruby">
テストコードは以下の通り
```ruby
require 'rails_helper'
include(HomesHelper)

RSpec.describe HomesHelper, type: :helper do
  # pending "add some examples to (or delete) #{__FILE__}"

  describe "GET /homes" do
    it "about add method" do
      # normal case
      sum = HomesHelper.add( 1, 2)
      expect(sum).to eq(3)

      # either nil
      sum = HomesHelper.add( nil, 2)
      expect(sum).to eq(0)

      # either nil
      sum = HomesHelper.add( 1, nil)
      expect(sum).to eq(0)

      # both nil
      sum = HomesHelper.add( nil, nil)
      expect(sum).to eq(0)
    end
  end
end

 

 

it から end までがテストの一単位ですね。 実行してみます。

$ rspec spec/helpers
Please report a bug if this causes problems.
.

Finished in 0.02032 seconds (files took 4.38 seconds to load)
1 example, 0 failures

はい成功です。 今回は一発目で成功しましたが、 失敗すると

$ rspec spec/helpers
WARN: Unresolved specs during Gem::Specification.reset:
      diff-lcs (< 2.0, >= 1.2.0)
WARN: Clearing out unresolved specs.
Please report a bug if this causes problems.
.

Finished in 0.02032 seconds (files took 4.38 seconds to load)
1 example, 0 failures

こういう感じになります。 今回はシンプルなパターンだったので、 もう少し複雑なパターンを試してみたいです。

試したらまたこのブログで紹介します。

rspecは他にもcontrollerやmodel,routingもテストできます。

はい!今回はここまで。