assert()メソッドをRubyのKernelクラスに追加するのは慣用的なRubyですか?
質問
Kent BeckのxUnitに相当するものをRubyでコーディングすることで、Rubyの理解を広げています。 Python(Kentが書いている)には、広く使用されている言語のassert()メソッドがあります。 Rubyはサポートしていません。これは簡単に追加できると思いますが、カーネルはそれを置くのに適した場所ですか?
ところで、 RubyのさまざまなUnitフレームワークの存在を知っています-これは、「何かを成し遂げる」のではなく、Rubyのイディオムを学ぶための演習です。
解決
いいえ、ベストプラクティスではありません。 Rubyでassert()に最もよく似ているのは、単に上げることです
raise "This is wrong" unless expr
また、より具体的な例外処理を提供したい場合は、独自の例外を実装できます
他のヒント
Rubyでアサートを使用することは完全に有効だと思います。ただし、2つの異なることに言及しています。
- xUnitフレームワークは、テストの期待値を確認するために
assert
メソッドを使用します。アプリケーションコードではなく、テストコードで使用することを目的としています。 - C、Java、Pythonなどの一部の言語には、プログラムのコード内で使用することを目的とした
assert
構造が含まれており、整合性についての仮定を確認します。これらのチェックは、コード自体の内部に構築されます。これらはテスト時のユーティリティではなく、開発時のユーティリティです。
最近 solid_assert:Rubyアサーションユーティリティを実装する小さなRubyライブラリとその動機を説明する私のブログの投稿。次の形式で式を記述します。
assert some_string != "some value"
assert clients.empty?, "Isn't the clients list empty?"
invariant "Lists with different sizes?" do
one_variable = calculate_some_value
other_variable = calculate_some_other_value
one_variable > other_variable
end
また、これらを無効にすると、 assert
および invariant
が空のステートメントとして評価されます。これにより、本番環境でのパフォーマンスの問題を回避できます。ただし、プラグマティックプログラマーは非アクティブ化を推奨していることに注意してください。それらがパフォーマンスに実際に影響する場合にのみ、非アクティブ化する必要があります。
慣用的なRubyの方法は通常の raise
ステートメントを使用しているという回答については、表現力に欠けると思います。アサーティブプログラミングの黄金律の1つは、通常の例外処理にアサーションを使用しないことです。それらは2つのまったく異なるものです。それらの2つに同じ構文を使用する場合、コードはより不明瞭になると思います。そしてもちろん、それらを無効にする機能は失われます。
ジャーニーマンからマスターへの実用的なプログラマーおよびコード完了それらへのセクションとそれらの使用をお勧めします。 アサーションを使用したプログラミングこれは、アサーティブプログラミングとは何か、いつ使用するかを非常によく示しています(Javaに基づいていますが、概念はどの言語にも適用されます)。
アサートメソッドをカーネルモジュールに追加する理由は何ですか? アサーション
などと呼ばれる別のモジュールを使用しないのはなぜですか?
これに似ています:
module Assertions
def assert(param)
# do something with param
end
# define more assertions here
end
アサーションを本当に利用可能にする必要がある場合は、どこでも次のようにします:
class Object
include Assertions
end
免責事項:コードをテストしませんでしたが、原則としてこのようにします。
特に慣用的ではありませんが、良いアイデアだと思います。特に次のようにした場合:
def assert(msg=nil)
if DEBUG
raise msg || "Assertion failed!" unless yield
end
end
DEBUG(または他の便利なスイッチ、私は過去にKernel.do_assertを使用した)セットで実行しないことにした場合、そのように影響はありません。
私の理解では、Rubyに慣れる方法として、独自のテストスイートを作成しているということです。 Test :: Unitはガイドとして役立つかもしれませんが、おそらくあなたが探しているものではありません(すでに仕事を終えているからです)。
とはいえ、Pythonのアサートは(少なくとも私にとっては)、Cのに似ています。 assert(3)。これは、単体テスト用に特別に設計されたものではなく、「これが絶対に起こらない」ケースをキャッチするためのものです。
Rubyの組み込み単体テストが問題をどのように見ているのかは、個々のテストケースクラスが TestCase には、「assert」が含まれます。渡されたものの有効性をチェックし、レポート用に記録するステートメント。