小宮です。

Masaki Suketa <CQN02273 / nifty.ne.jp> wrote:

> >     RUNIT::Assert#assert_test(obj1, op, obj2 [,message])
> > 
> >     !obj1.send(op, obj2) のときに RUNIT::AssertionFailedError
> >     例外を発生させる。第 3 引数が指定された場合は、 message
> >     文字列とともに例外を発生させる。(別名: assert_comparison)
> 
> これ、いいですね。取り込ませていただきます。

おお、こういった機能は前から欲しかったので嬉しいです。

>
> が、assert_testという名前はちょっと一般的過ぎるので
> もうちょっとぴったり来る名前をつけたいところです。
> 逆にassert_comparisonは用途が限定され過ぎるイメージがあるので
> ちょっと
>
>って思ったのですが、op は <=> みたいな奴じゃなくてどんな
>メソッドでもいいのか。うーむ。
>assertの代わりに使えるのだから、assert_testでいいのか。

assert_testでも良いと思うのですが、私が以前考えていたのはassertを拡張し
て、第二引数がシンボルだったらそのメソッドでテストを行うようにするという
ものです。

その線でassert_equalにも同様の事が行えるようするというのはどうでしょうか?

こんな感じで・・・

    assert          ary1, :empty?
    assert          ary2, :include?, 1

    assert_not      ary1, :include?, 1
    assert_equal 4, ary2, :size

引数の型で振舞いが変るのはあんまりrubyらしくないとは思いますが、コードの
読みやすさは犠牲になっていないと思います。

この案の欠点はfailした際のmessageを指定できないことだと思うのですが、実
際にはそれほど困らない気がします。というのは、自分がassertにメッセージを
渡している場合を振り返ると、ほとんどが単に

    assert ary.include?(1), "not include 1"

みたいに、コードとメッセージで同じ事を繰り返しているだけなので。

----
kom / mail1.accsnet.ne.jp
小宮 健一