0

それぞれの機能テストでさまざまな形式を自動的にテストしたいと思います。これを実現する方法は、'test'メソッドを自分のクラスメソッドでラップすることのようです。

def self.test_all_formats(name)
  [ "xml", "json" ].each do |fmt|
    test "#{name} #{fmt}" do
      yield(format)
    end
  end
end

test_all_formats "index" do |fmt|
  get :index, { :format => fmt }
  assert_response :ok
end

残念ながら、各テストの結果、次のエラーが発生します。

NoMethodError:AccountsControllerTest:Classの未定義のメソッド`get'。

ブロックの実行はテストの実行まで延期されますが、インスタンスではなくクラスのコンテキストでブロックを実行しようとしています。

この自動テストを実現する方法はありますか?

4

2 に答える 2

0

以下は私のために働いた:

class << self
  def test_all_formats(name, &block)
    [ "xml", "json" ].each do |fmt|
      test "#{name} #{fmt}" do
        instance_exec fmt, &block
      end
    end
  end
end

test_all_formats "index" do |fmt|
  get :index, { :format => fmt }
  assert_response :ok
end
于 2012-09-15T05:21:41.813 に答える
0

このコードは元々ChrisOeiのソリューションとして提供されたものであり、instance_execの使用が嫌いな場合に適している可能性があります。

class << self
   def test_formats(name, &block)
    define_method "fmt_#{name}", &block
      [ "xml", "json" ].each do |fmt|
        test "#{name} #{fmt}" do
          send "fmt_#{name}", fmt
        end
      end
    end
  end
end
于 2012-09-21T17:52:55.600 に答える