2

私はイライラしながら長い間インターネットを見回してきましたteardown()が、MiniTest でのメソッドの目的とその使用方法についてはまだかなり混乱しています。

私が持っている基本的な要点は、各テストの後に1回実行し、2回テスト中に行われたことを元に戻して、将来のテストをクリーンな環境で実行できるようにすることです。

ただし、元に戻す必要があるものの性質については不明です。DBを空にする必要がありますか? クラス変数をリセットしますか? 等

メソッドが明示的に記入されるべきかどうかについても不明です。teardown()が完全に例から除外されている多くの例を見つけました。

(私の最善の推測では、teardown自動的に実行され、特定のものを処理するスーパーメソッドが存在するということです。それは、なぜそれがしばしば取り残されるのかを説明し、特定のteardown()メソッドで一部がリセットされ、一部がリセットされない理由も説明します。 .しかし、どれがそうでどれがそうでないかはまだわかりません。)

要するに:

ティアダウンを明示的に作成する必要がありますか? どのような状況で上書きする必要があり、どのような場合に上書きしないのでしょうか?

4

1 に答える 1

6

最も簡単な答えは#teardown、すべてのテストで使用することですが、心配する必要はありません。Rails ライフサイクルと同様に、Minitest ライフサイクルがあります。テストで使用するロジックと動作を挿入するためのフックがあります。Rails テストの主なものはデータベース トランザクションです。を使用する各テストActiveSupport::TestCaseは、データベース トランザクションで実行されます。流れは次のようになります。

  1. データベース トランザクションの作成 ( Minitest::Test#setup)
  2. テスト メソッドを実行します ( MyTest#test_something)
  3. データベース トランザクションをロールバックします ( Minitest::Test#teardown)

#setupテストで使用するオブジェクトを作成するために使用することは、人々にとってやや一般的です。テスト メソッドが完了すると、テスト オブジェクトはガベージ コレクションされるため、ほとんどの人は#teardownテスト後のクリーンアップを使用しません。これ#teardownは通常、テストを作成するときに通常は使用しない、より高度な機能です。Minitest を強化するライブラリのテストで、より頻繁に使用されていることがわかります。

しかし#teardown、テストで使用する場合があります。これを使用する場合の例を次に示します。

require "minitest/autorun"

class Foo
  def initialize namer
    @namer = namer
  end
  def name
    @namer.name
  end
end

class FooTest < Minitest::Test
  def setup
    @namer_mock = Minitest::Mock.new
    @namer_mock.expect :name, "foo"
    @foo = Foo.new @namer_mock
  end

  def test_name
    assert_equal "foo", @foo.name
  end

  def teardown
    @namer_mock.verify
  end
end
于 2015-08-21T15:15:59.140 に答える