rspec/minitest for Ruby: 如何将一组对象变成单独的测试?

rspec/minitest for Ruby: How to turn an array of objects into individual tests?

我正在为一种小型语言编写一个解析器,该语言的测试规范格式为 JSON,实际上是这样的:

[ {"input":"foo", "output":"bar"}, 
  {"input":"baz", "output":"boo"},
  ...]

假设我已经将 JSON 解析为一个散列数组,我将如何编写一个使用 input 作为描述符的规范并针对每个 [=14= 测试我的库]?

简单地遍历散列。您有几个选择:

inputs_and_outputs = [
  { 'input' => 'a', 'output' => 'x' },
  { 'input' => 'b', 'output' => 'y' }
]

标准迷你测试

# One test with multiple assertions
def test_that_it_returns_the_expected_outputs
  inputs_and_outputs.each do |input_output|
    input = input_output['input']
    output = input_output['output']

    assert_equal output, your_function(input)
  end
end


# Separate test per input output
inputs_and_outputs.each do |input_output|
  input = input_output['input']
  output = input_output['output']

  define_method("test_returns_#{output}_given_#{input}") do
    assert_equal output, your_function(input)
  end
end

Minitest 规范

# One test with multiple assertions
it "returns the expected outputs" do
  inputs_and_outputs.each do |input_output|
    input = input_output['input']
    output = input_output['output']

    assert_equal output, your_function(input)
  end
end

# Separate test per input output
inputs_and_outputs.each do |input_output|
  input = input_output['input']
  output = input_output['output']

  it "returns #{output} given #{input}" do
    assert_equal output, your_function(input)
  end
end