如何使用MiniTest中的assert_equal比较数组中的所有元素

时间:2015-05-18 17:56:41

标签: ruby minitest

我正在比较数组中的值,但是当条件失败时,它会退出。在这里,我想比较数组的所有元素,无论通过和失败:

val.each do | x |
    #assert_equal 48000.00, x
    assert(48000.00 == x, message = " :Pass")
end

假设数组大小为20.它应该迭代20次而不管通过或失败条件,并且应该提高断言。

1 个答案:

答案 0 :(得分:1)

在我回答你的问题之前:

问题听起来是错误的',如果测试失败,为什么还要继续? 我的印象是,对测试逻辑存在更深层次的误解。也许你可以提供更多信息来查看这个问题背后的问题。

这里是您问题的完整MWE:

class TestArray < MiniTest::Test
  VAL = [
    48000.0,
    48000.0,
    3,
    48000.0,
  ]

  def test_orig
    VAL.each do | x |
      assert(48000.00 == x, message = " :Pass")
    end
  end

这将测试数组中的所有条目是否为48000.0。您可以使用以下命令进行类似的测试:

    def test_array #expects exact 4 entries.
      assert_equal([48000.00,48000.00,48000.00,48000.00], VAL, message = " :Pass")
    end
    def test_array_2 #flexible number of entries
      assert_equal([48000.00] * VAL.size, VAL, message = " :Pass")
    end
    def test_array_uniq
      assert_equal([48000.00], VAL.uniq, message = " :Pass")
    end

使用

    def test_diff
      assert_equal([], VAL - [48000.0], 'Entries not 48000.0 found')
    end

你会得到所有条目不等于48000.0。

但仍有问题: 如果测试失败,为什么还要继续?

第一次失败后测试停止。所以唯一的可能性就是测试自己的测试例程中的每个值:

  class TestArray < MiniTest::Test
    VAL = [
      48000.0,
      48000.0,
      3,
      48000.0,
    ]
    VAL.each_with_index do |val,i|
      define_method :"test_single_value_#{i+1}" do
        assert(48000.00 == val, message = "Diff for entry %i" % [i+1])
      end
    end
  end

代码为数组中的每个条目生成一个测试。但要获得此测试的可能性,必须在测试运行之前知道VAL。所以这可能不适合你的需要。