インスタンス変数の欠点
def sandwich @sandwich ||= Sandwich.new('delicious', []) end
rspec –format documentation
gem install coderay
rspec fd
-e keyword
allow(ledger).to receive(:record) .with(expense) .and_return(RecordResult.new(false, 417, 'Expense incomplete'))
は何なんだよ!ledgerのrecordメソッド。RecordResultがrecordに反応するかどうか?
bundle exec rackup config.ru #sinatra起動
bundle exec rspec –bisect –seed 32043
重複をなくす方法いろいろ。フックとかincludeとか。すごい綺麗になった。
メタデータをつけた効率的なテスト実行。
カスタマイズ。 出力を必要なものに絞るとか。あまりいらないような。
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
さらなるmatcher。
特定の型に反応するprimitive matcher
「同じ」にもいろいろある。
なんの脈絡もなくハリーポッターが出てきて笑う
U2も。作者がイギリスの人なんだなきっと。
新しいマッチャを定義する
スタブ、モック、スパイ、ヌルオブジェクト。
システムの一部を独立させてテストしやすいようにする
テスト用のはりぼてのクラスやメソッドを作ったり、テストのときだけ定義される定数なんかもできる。stub_const
前者3つの違いがよくわからん…。スタブ: 受信メッセージ用。依存するオブジェクトを決まりきった反応しかしないオブジェクトに変える。
モック: 送信メッセージ用。
設定
ダブルを効率的に