6

Perl modulinoモデルに従って、モジュール自体と同じソースファイルにモジュールの単体テストを含めようとしています。

#! /usr/bin/env ruby

require 'test/unit'

module Modulino
    def modulino_function
        return 0
    end
end

class ModulinoTest < Test::Unit::TestCase
    include Modulino
    def test_modulino_function
        assert_equal(0, modulino_function)
    end
end

これで、このソースファイルを実行する単体テストを実行できます。

ただし、別のスクリプトからそれらを要求/ロードするときにも実行されます。どうすればこれを回避できますか?

この慣習が推奨されない限り、Rubyでこれを達成するためのより慣用的な方法はありますか?

4

4 に答える 4

13

個人的には、Rubyでこれを行おうとしている人のことは聞いたことがありません。それは間違いなく標準的な習慣ではありません。それはあなたがこのトリックを活用することができるかもしれないと言った:

if __FILE__ == $0
  # Do something.. run tests, call a method, etc. We're direct.
end

ブロック内のコードはif、ファイルが直接実行された場合にのみ実行され、別のライブラリまたはアプリケーションで必要な場合は実行されません。

ここでより多くのルビーのトリック:http ://www.rubyinside.com/21-ruby-tricks-902.html

于 2009-12-01T16:10:26.610 に答える
3

Railsでは確かに一般的ではありませんが、Rubyではそれほど珍しいことではありません。

発生する可能性のある問題の1つは、この投稿と同じです。つまり、モジュールをテストするには、モジュールをクラスに含める必要があります。モジュールをテストケースに含めることでテストすることは確かに可能ですが、モジュールをTest :: Unit :: TestCaseに混合したときに機能するかどうかをテストしているのであり、より便利なものに混合したときに機能するわけではありません。

したがって、単体テストはおそらくクラスファイル上に存在する必要があります。または、一般的に利用可能なメソッドが必要な場合は、モジュールの代わりにクラス関数を使用します。

于 2009-12-01T17:08:05.140 に答える
3

minitestを使用して、モジュールのソースコード自体に単体テストを含めることができます。

この例を試してください:

class Foo < String
end

if $0 == __FILE__
    require 'minitest/autorun'
    require 'minitest/pride'

    class FooTest < MiniTest::Unit::TestCase
        def test_foo_instantiation
            foo = Foo.new()
            assert_instance_of Foo, foo
        end

        def test_foo_parent_class
            foo = Foo.new()
            assert_kind_of String, foo
        end
    end
end

ここでは、Stringクラスを継承するFooというクラスを作成しました。次に、2つの単体テストを作成しました。最初のテストでは、クラスFooのオブジェクトをインスタンス化できることを確認します。2番目のテストでは、クラスFooのインスタンス化されたオブジェクトが一種の文字列であることを確認します。

このコードがfoo.rbというファイルに記述されている場合は、次のコマンドを使用してテストを実行できます。

ruby foo.rb

ミニテストは実行が高速です。「プライド」モジュールを使用すると、テスト結果をカラーフォントで出力できます。これは見た目にも便利です。

于 2013-09-27T09:38:07.340 に答える
1

スクリプトからモジュールが必要なときに単体テストが実行されないようにする1つの方法を見つけました。trueに設定するためunit.rbのフラグがあります。.../lib/ruby/1.8/test/

samgトリック(ありがとう)と組み合わせると、次のように書くことができます。

if (__FILE__ != $0)
    Test::Unit.run = true  ### do not run the unit tests
end
于 2009-12-02T12:28:15.060 に答える