3

これは私が持っている状況の最小限の一般的な例です:

test / mytest.rb

describe "What I want to test" do
  include TestUtils

  temporary_change_value(settings, :tmp_setting, value)

  describe "test1 blablabla" do
    # ...
  end

  describe "test2 blablabla" do
    # ...
  end
end

test / support / test_utils.rb

module TestUtils

  def self.included(base)
    base.class_eval do
      extend ClassMethods

      before do
        MyMainClass.interface = TestInterface.new
        MyMainClass.handler.display.clear
      end

      after do
        MyMainClass.handler.display.clear
      end
    end
  end

  module ClassMethods

    def temporary_change_value(item, key, value)
      old_value = nil

      before do
        old_value = item[key]
        item[key] = value
      end

      after do
        item[key] = old_value
      end
    end

  end
end

TestUtilsモジュールはeveyテストファイルに含まれているため、commonタスクbeforeendtasksは常に実行されますが、この場合temporary_change_value、このファイル内のすべてのテストのbeforeブロックとしてメソッドを使用する必要もあります。これは機能していません。/ブロックの1つだけが実行されているようですbeforeend具体的には、を設定するブロックMyMainClass.interface

私が試したこと

beforeこのように/endブロックの順番を変えてみました。

describe "What I want to test" do
  extend TestUtils::ClassMethods

  temporary_change_value(settings, :tmp_setting, value)

  include TestUtils

  describe "test1 blablabla" do
    # ...
  end

  describe "test2 blablabla" do
    # ...
  end
end

まだ動作していません。現在、settings値は変更されていないため、実行されるのは2番目のbefore/endブロックのみが含まれているようです。

質問:どうすればこれを達成し、それでも乾いた状態に保つことができますか?

4

2 に答える 2

2

MiniTest 3.3以降、before / endは単なるメソッドであり、フックではありません。したがって、before do ... endを呼び出すと、以前のbeforeメソッドを上書きすることになります。代わりに使用できるのはMiniTest::TestCase.add_setup_hookhttp://bfts.rubyforge.org/minitest/MiniTest/Unit/TestCase.html#method-c-add_setup_hook)です。探しているものを達成するために、その特定のテストケースtemporary_change_value()のブロック内からコードを配置できるはずです。add_setup_hook

于 2013-04-10T19:15:15.763 に答える
1

Minitest gem @zenspiderのマンテナーのおかげで、ようやくこれを解決することができました。

test / my_test.rb

class TestWhatIWant < TestUtils::TestCase
  temporary_change_value settings, :tmp_setting, value

  describe "test1 blablabla" do
    # ...
  end

  describe "test2 blablabla" do
    # ...
  end
end

test / support / test_utils.rb

module TestUtils
  module ClassUtils

    def temporary_change_value item, key, value
      mod = Module.new do
        extend Minitest::Spec::DSL

        before do
          @old_value = item[key]
          item[key] = value
        end

        after do
          item[key] = @old_value
        end
      end

      include mod
    end

    class TestCase < Minitest::Spec
      extend TestUtils::ClassUtils
      include TestUtils

      def setup
        Byebug.interface = TestInterface.new
        Byebug.handler.display.clear
      end
    end

  end
end
于 2013-05-16T15:34:21.087 に答える