14

組み込みの Ruby Minitest フレームワークを使用して、スイート全体が実行される前に 1 回、または TestClass 全体が実行される前に 1 回でもコードを実行する方法はありますか? この質問への回答で、Test::Unit::after_tests を使用して、すべてのテストが実行された後にコードを実行できることがわかります。すべてのテストが実行される前にコードを実行する同様の方法はありますか?

この機能を使用して、テストを実行する前にテスト データベースを初期化し、すべての実行後に破棄したいと考えています。

ありがとう!

4

2 に答える 2

17

これは、MiniTestドキュメント(カスタマイズ可能なテスト ランナー タイプの下) から変更されています。

class Burger
  def initialize
    puts "YOU CREATED A BURGER"
  end

  def has_cheese?
    true
  end

  def has_pickle?
    false
  end
end

gem 'minitest'

require 'minitest/unit'
MiniTest::Unit.autorun

class MyMiniTest
  class Unit < MiniTest::Unit

    def before_suites
      # code to run before the first test
      p "Before everything"
    end

    def after_suites
      # code to run after the last test
      p "After everything"
    end

    def _run_suites(suites, type)
      begin
        before_suites
        super(suites, type)
      ensure
        after_suites
      end
    end

    def _run_suite(suite, type)
      begin
        suite.before_suite if suite.respond_to?(:before_suite)
        super(suite, type)
      ensure
        suite.after_suite if suite.respond_to?(:after_suite)
      end
    end

  end
end

MiniTest::Unit.runner = MyMiniTest::Unit.new

class BurgerTest < MiniTest::Unit::TestCase

  def self.before_suite
    p "hi"
  end

  def self.after_suite
    p "bye"
  end

  def setup
    @burger = Burger.new
  end

  def test_has_cheese
    assert_equal true, @burger.has_cheese?
  end

  def test_has_pickle
    assert_equal false, @burger.has_pickle?
  end

end

gem 'minitest'メソッドを持たないバンドルされたバージョンの代わりに、gem を使用するために含めたことに注意してくださいMiniTest::Unit.runner。これが出力です。

Run options: --seed 49053

# Running tests:

"Before everything"
"hi"
YOU CREATED A BURGER
.YOU CREATED A BURGER
."bye"
"After everything"


Finished tests in 0.000662s, 3021.1480 tests/s, 3021.1480 assertions/s.

2 tests, 2 assertions, 0 failures, 0 errors, 0 skips

したがって、2回呼び出します#setup.before_suite.after_suite1回だけです。これがあなたが探しているものだと思います。

于 2011-07-20T15:49:14.347 に答える