assert()メソッドをRubyのKernelクラスに追加するのは慣用的なRubyですか?

StackOverflow https://stackoverflow.com/questions/147969

  •  02-07-2019
  •  | 
  •  

質問

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」が含まれます。渡されたものの有効性をチェックし、レポート用に記録するステートメント。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top