目次

Effective Testing with RSpec 3

1

インスタンス変数の欠点

def sandwich
  @sandwich ||= Sandwich.new('delicious', [])
end

2

3

4

5

allow(ledger).to receive(:record)
    .with(expense)
    .and_return(RecordResult.new(false, 417, 'Expense incomplete'))

は何なんだよ!ledgerのrecordメソッド。RecordResultがrecordに反応するかどうか?

6

7

重複をなくす方法いろいろ。フックとかincludeとか。すごい綺麗になった。

8

メタデータをつけた効率的なテスト実行。

9

カスタマイズ。 出力を必要なものに絞るとか。あまりいらないような。

10

expectation

matcherは正規表現のようなものだ。文字列のかわりに特定のオブジェクトでマッチする。 175ページは興味深い。マッチャがどう反応するか試している。適当に作ったオブジェクトをexpectにわたすと、no method errorが出る。matches? がないらしい。matches?を追加する。

matcher = Object.new

def matcher.matches?(actual)

actual == 1

end

1だと正を返すような。それで、

expect(1).to matcher # ⇒ true expect(2).to matcher # ⇒ no method error, 'failure_message'

def matcher.failure_message

'failure'

end

irbでマッチャをチェック

require 'rspec/expectations'
include RSpec::Matchers

マッチャを組み合わせるときに.andもしくは&などを使う。or,not..

descriptionがメソッドを文字に変更するようす

[57] pry(main)> (start_with(1) & end_with(9)).description
=> "start with 1 and end with 9"

↑を利用してit内を省略できるときがある。一行のマッチャのとき?

# fish_oilが重複している
it 'should not include:fish_oil' do
  expect(CookieRecipe.new.ingredients).not_to include(:fish_oil)
end 
 
=> should not include:fish_oil
specify do
  expect(CookieRecipe.new.ingredients).not_to include(:fish_oil)
end
 
=> should not include:fish_oil

最初にsubjectを指定しておくことでexpectにいつも書く手間が省けることがある。is_expected_to

11

さらなるmatcher。 特定の型に反応するprimitive matcher

「同じ」にもいろいろある。

なんの脈絡もなくハリーポッターが出てきて笑う

U2も。作者がイギリスの人なんだなきっと。

12

新しいマッチャを定義する

13

スタブ、モック、スパイ、ヌルオブジェクト。

システムの一部を独立させてテストしやすいようにする

テスト用のはりぼてのクラスやメソッドを作ったり、テストのときだけ定義される定数なんかもできる。stub_const

前者3つの違いがよくわからん…。スタブ: 受信メッセージ用。依存するオブジェクトを決まりきった反応しかしないオブジェクトに変える。

モック: 送信メッセージ用。

14

設定

15

ダブルを効率的に