
RSpecのbefore、afterフック内で例外が起きるとどうなるのか調べてみた。なんでかというと、そこでとあるサーバプロセスを開いたり、テストデータ作成をやっていたりして、万が一例外が起きてしまったときに、サーバが立ち上がりっぱなしになっていたり、テストデータの残骸ができてしまったり、後処理が必要だと感じたから。
それぞれのフックの中でログを出しておき、どの処理が呼ばれるのかを調査してみた。全部呼ばれると以下になるはず。
- config.before(:suite) do
- before(:all) do
- config.before(:each) do
- before(:each) do
- after(:each) do
- config.after(:each) do
- config.after do |example|
- after(:all) do
- config.after(:suite) do
config.before(:suite) doで例外発生
- config.before(:suite) do => 例外発生
before(:all) doconfig.before(:each) dobefore(:each) doafter(:each) doconfig.after(:each) doconfig.after do |example|after(:all) doconfig.after(:suite) do
例外発生箇所以降は呼ばれないパターン。こういうときにプロセスのクローズとかを考えないとだめなんですね。
before(:all) do で例外発生
- config.before(:suite) do
- before(:all) do=> 例外発生
config.before(:each) dobefore(:each) doafter(:each) doconfig.after(:each) doconfig.after do |example|- after(:all) do
- config.after(:suite) do
all 内の例外発生パターンだと after が呼ばれてる。
config.before(:each) do で例外発生
- config.before(:suite) do
- before(:all) do
- config.before(:each) do => 例外発生
before(:each) do- after(:each) do
- config.after(:each) do
- config.after do |example|
- after(:all) do
- config.after(:suite) do
before(:each) do だけ呼ばれない。
before(:each) do で例外発生
- config.before(:suite) do
- before(:all) do
- config.before(:each) do
- before(:each) do => 例外発生
- after(:each) do
- config.after(:each) do
- config.after do |example|
- after(:all) do
- config.after(:suite) do
before(:each) do 内までくると全メソッド通る。
Itで例外発生
- config.before(:suite) do
- before(:all) do
- config.before(:each) do
- before(:each) do => 例外発生
- after(:each) do
- config.after(:each) do
- config.after do |example|
- after(:all) do
- config.after(:suite) do
before(:each) do で例外発生と同じ。全部呼ばれる。
after(:each) do で例外発生
- config.before(:suite) do
- before(:all) do
- config.before(:each) do
- before(:each) do
- after(:each) do=> 例外発生
- config.after(:each) do
- config.after do |example|
- after(:all) do
- config.after(:suite) do
after で例外発生しても、結局全部呼ばれている。
config.after(:each) do で例外発生
- config.before(:suite) do
- before(:all) do
- config.before(:each) do
- before(:each) do
- after(:each) do
- config.after(:each) do => 例外発生
- config.after do |example|
- after(:all) do
- config.after(:suite) do
全部呼ばれている。
config.after do |example| で例外発生
- config.before(:suite) do
- before(:all) do
- config.before(:each) do
- before(:each) do
- after(:each) do
- config.after(:each) do
- config.after do |example| => 例外発生
- after(:all) do
- config.after(:suite) do
こちらも全部呼ばれている。
after(:all) doで例外発生
- config.before(:suite) do
- before(:all) do
- config.before(:each) do
- before(:each) do
- after(:each) do
- config.after(:each) do
- config.after do |example|
- after(:all) do => 例外発生
config.after(:suite) do
config.after(:suite) do が呼ばれない。
config.after(:suite) do で例外発生
- config.before(:suite) do
- before(:all) do
- config.before(:each) do
- before(:each) do
- after(:each) do
- config.after(:each) do
- config.after do |example|
- after(:all) do
- config.after(:suite) do => 例外発生
全部呼ばれる。