4

既存の Rails 2.3.14 アプリケーションで minitest を試してみたいと思います。すでにいくつかのアプローチを試しましたが、どれもうまくいかないようです。

要するにこれに尽きます。minitest を Gemfile に追加すると、実行したすべてのテストが minitest ではbundle exec rake test実行されません。

問題は、ほとんどのテスト ケースが ActiveSupport::Testcase または ActionController::Testcase (ActiveSupport::TestCase を拡張する) を拡張することです。

このクラスのコードを見ると、すでに (どういうわけか) MiniTest をサポートしていることがわかりました。

class TestCase < ::Test::Unit::TestCase
    if defined? MiniTest
      Assertion = MiniTest::Assertion
      alias_method :method_name, :name if method_defined? :name
      alias_method :method_name, :__name__ if method_defined? :__name__
    else
...
end

(完全なコードについては、 https://github.com/rails/rails/blob/2-3-stable/activesupport/lib/active_support/test_case.rbを参照してください)

ここでの私の質問は次のとおりです。

Rails 2.3でtest::unitの代わりにminitestを拡張せずに使用することはどういうわけか可能ですか(MiniTest::Unit::TestCase)

4

1 に答える 1

2

すべてのテスト フレームワークは、テストを定義して実行する方法 (これをテスト ランナーと呼びます) とアサーション フレームワークの 2 つで構成されます。

ActiveSupport を見ると、MiniTest が定義されている場合、レール ユニット テスト ランナーを実行すると、デフォルトで MiniTest のアサーション クラスが使用されるようです。これは、Minitest のアサーション構文を使用できることを意味します。

MiniTest を定義することは、'minitest\unit' を必要とする場合にすぎません。

ただし、ランナーを使用する場合は、MniTest フレームワーク テスト フィクスチャの基本クラスから派生させる必要があります。

Railscastsには、自分でセットアップするための段階的なウォークスルーがあります。

要約すると、次のようになります。

  1. config/applications.rb から test_unit を削除します
  2. 最小の gem を gem ファイル「Gemfile」に追加します。
  3. テストに含めることができるヘルパー ファイルで環境をセットアップする
  4. テストを実行する rake タスクを追加します。(/lib/tasks/minitest.rake)

Railscastsに詳細があります。

それを行うために既存のテストを変更したくない場合は、Test::Unit にモンキー パッチを適用して、TestCase を再定義し、選択した MiniTest ベース クラスまたはその派生クラスにする必要があります。これは、この gemが採用するアプローチであり、そのための最善の方法についていくつかのアイデアを提供する可能性があります。

もう 1 つの解決策は、コードを検索/置換して、テスト ケースの基本クラスを切り替えることです。

これが役立つことを願っています。


回答を更新し、以下を古いものとして削除しました。

minitest-rails は、Rails 3.1 でのみ機能するため、正しく指摘されています。

この宝石は古い (2009 年 3 月 26 日) ようですが、役に立つかもしれません。同様のことを行うためのヒントが必要な場合は、ソース コードを確認してください。

于 2012-06-03T09:24:39.770 に答える