Effective Testing with RSpec 3
1
Tests .. あるコードが適切に動くかどうか
Specs .. 望む動作を記述する
Examples .. 例を示す
インスタンス変数の欠点
def sandwich
@sandwich ||= Sandwich.new('delicious', [])
end
2
exampleを論理的に構造化する
適切な詳細さで望む結果を書く
セットアップを共有する
contextはオブジェクトを変化させるテストのときに用いる
出力を見やすい形式に変えられる rspec –format documentation
シンタックスハイライトもできる gem install coderay
rspec fd
キーワードを含むテストだけを実行: -e keyword
RSpec-modeがある
あらかじめテストしたい見出しを書いておけばワークフローになって忘れない。pendingを使う。
3
4
5
allow(ledger).to receive(:record)
.with(expense)
.and_return(RecordResult.new(false, 417, 'Expense incomplete'))
は何なんだよ!ledgerのrecordメソッド。RecordResultがrecordに反応するかどうか?
6
-
GETメソッドを追加する。
bundle exec rackup config.ru #sinatra起動
最初にテストを作っておけばいちいちブラウザでできたか確認する必要がない。
bundle exec rspec –bisect –seed 32043
毎回DBをrollbackするために、設定を追加する。requireをヘルパーに追加して、:dbが使われるときに読み込むようにする。
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
blog/2020/1015_effective_testing_with_rspec_3.txt · 最終更新: 2020/11/30 00:23 by kijima