石橋"rubyholic"秀仁です。

From: Masaki Suketa <CQN02273 / nifty.ne.jp>
Subject: [ruby-list:22953] Re: assert with iterator
Date: Sat, 27 May 2000 19:58:56 +0900

> 助田です。

> In message "[ruby-list:22778] Re: assert with iterator"
>     on 00/05/22, "Masaru Ishii" <mishii / ainix.isac.co.jp> writes:

> > また,例外をアサートする場合は,例外が起こってから,
> > 例外オブジェクトに対してアサートを書きたくなります.
> > messageの内容をアサートするとか.
> > これは,assert_exceptionでは対応できませんね.
> 
> はい。できません。
> assert_exception で
> 指定した例外が発生したらその例外オブジェクトを返す。
> 例外が発生しない場合はnilが返ってくる。
> で良いですか?
> 後は例外オブジェクトを煮るなり焼くなり好きにしてもらう。
> 
> exception = assert_exception(XXXError) {...}
> # exceptionに対する assertを続けて自由に書く。
> 
> うーん。でもちょっと気持悪い。もうちょっと良い方法
> ないですかね?

ええと、「例外をアサートする」なら例外を起こしているのは
自分なんですから、begin ... rescue ... end ではダメですか。
その機能は不要だと思います。

理由は:

(1) 例外オブジェクトの参照は $! でガマンします。いずれ、
ruby-dev で話題の rescue StandardError : var
のような文法が実現するから。

(2) assert 文の意味は静的に決まるべき。「例外が起こったら」
というコードを書くべきではありません。「ここでこの例外を起こす」
ように書くのがテストです。それ以外の例外はありえません。
ありえないから failure ではなく error です。


なんでも assert 系列メソッドで統一する必要ないと思います。
# と思うようになってきました (^^;
以下に begin ... rescue ... else ... end の例を書きます。

  begin
    single_method_call  # 単発メッセージ
  rescue FooBarError
    raise AssertionFailedError
  end

上のは rescue しないと、発生した例外が failure ではなく
error になりますね。これが、そもそも assert_no_exception
が必要な理由かなと思います。

  begin
    single_method_call  # 単発メッセージ
  rescue FooBarError
    # expected exception: do nothing
  else
    raise AssertionFailedError
  end

これが assert_exception ですよね。

以上の 2 つの書きかたで問題ありますか?
ぼくは assert_exception より、こっちが好きです。
# 行数が減るというのは大きいかもしれませんが。


あと、もう一つ、Ruby 一般の話になります。

「例外オブジェクトのアサート」といっても、そもそも、
複雑な例外オブジェクトが必要になるのでしょうか・・・

そういうものは、例外ではなく返り値とすべきではないかな、
と思います。例外の種類なら例外オブジェクトのクラスで
わかりますし。もちろん構造を持つほど複雑なオブジェクトは、
考慮されていないと思うのですが・・・


ところで、

From: "Masaru Ishii" <mishii / ainix.isac.co.jp>
Subject: [ruby-list:22778] Re: assert with iterator

> まあ,だからといってすべてRubyUnitで対応してほしい,
> ということではないです.仕様が複雑になってややこしく
> なってほしくありませんので.

ぼくも賛成です。本家 Testing Framework に追従して
複雑になるぶんには構いませんけど、Ruby に特化して
複雑になるのは、使う人にも作る人にも嬉しくないかと :-)

--
Hideto "rubyholic" ISHIBASHI
http://www.rr.iij4u.or.jp/~hideto-i/
blade clone (yaiba) development:
http://www.rr.iij4u.or.jp/~hideto-i/rb/yaiba/index.html