よろしくお願いしますm(__)m
Rspecでテストケースを書いていて疑問に思った点がありました。
自分なりに調べて理解したつもりなのですが、
私の解釈があっているかどうかチェックしてただけないでしょうか。
間違っている箇所がありましたら
ご指摘いただけると幸いです。
どうか宜しくお願い致します!!!!
///////////////////////////////ここから
テストケースでモックやスタブを作るということは
テストを走らせた時のアプリケーションの挙動を変更するということである。
ruby
1class Hoge 2 def hoge 3 "hogehoge" 4 end 5end
というメソッドがあって
ruby
1let(:class) { described_class.new } 2it do 3allow(class).to receive(:hoge).and_return('piyopiyo') 4end
というスタブを作ったら、
テストを実行し、hogeメソッドが実行された時に"piyopiyo"が返り値となるようになる。
binding.pryで止めてhogeを実行すると以下のようになる。
[1] pry(#ConfirmContractRenewal::Base)> hoge
"piyopiyo"
ちなみに
ruby
1allow(class).to receive(:hoge)
とand_return('piyopiyo')
を指定しないと、
[1] pry(#ConfirmContractRenewal::Base)> hoge
nil
となる
疑問点
今回疑問に思った箇所は
ruby
1# class 2class Hoge 3 NotificationMailer.delay.auto_contract_renewal(plan) 4end 5 6# rspec 7RSpec.describe Hoge do 8 let(:delay) { double('delay') } 9 it do 10 allow(NotificationMailer).to receive(:delay).and_return(delay) 11 expect(delay).to receive(:auto_contract_renewal).exactly(10).times 12 end 13end
ここのexpect(delay)
の箇所でdelayが:auto_contract_renewal
メソッドを持ってる体でテストを行えるのか?
が疑問だった。
だってdelayってただの空のダブルオブジェクトでしょ?
検証
本来はNotificationMailer.delay
を実行すれば、delayメソッドがオブジェクト(以下オブジェクト①とする)を返す。
そしてそのオブジェクト①がauto_contract_renewalメソッド
を持っている。
スタブを作成してテストを実行すると
本来NotificationMailer.delay
が返すオブジェクトがダブルオブジェクトになる。
ダブルとは『代役』とか『影武者』という意味である。
ダブルオブジェクトとは①の代役である
なのでオブジェクト①が持っているメソッドを使えるように振る舞うことが出来る。
ここでもbinding.pryで止めて検証
ruby
1[16] pry(#<ConfirmContractRenewal::Base>)> NotificationMailer.delay 2#<Double "delay"> 3 4[18] pry(#<ConfirmContractRenewal::Base>)> NotificationMailer.delay.class 5RSpec::Mocks::Double < Object 6 7[19] pry(#<ConfirmContractRenewal::Base>)> NotificationMailer.delay.methods.grep(/auto/) 8[ 9 [0] auto_contract_renewal(*args, &block) #<Double "delay"> 10 [1] autoload_all(*paths) RSpec::Mocks::Double (RequireAll) 11 [2] autoload_rel(*paths) RSpec::Mocks::Double (RequireAll) 12]
となる。
ダブルオブジェクトがauto_contract_renewal
と持っている。
これが
ここの
expect(delay)
の箇所でdelayが:auto_contract_renewal
メソッドを持ってる体でテストを行えるのか?
が疑問だった。
の答えになった。
///////////////////////////////ここまで
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/29 23:53