使用Ruby线束在JSON中定义测试规范的最佳方法是什么?

时间:2012-04-06 12:07:43

标签: ruby unit-testing minitest

我有一个有趣的难题。我正在开发一个库来解析Ruby中的PSD。另外,一个伙伴同时在一个库上工作来解析JavaScript中的PSD。我们想通过git子模块共享相同的单元测试。

我们决定使用简单的JSON DSL来定义每个测试。单个测试可能如下所示:

{
  "_name": "Layer should render out",
  "_file": "test/fixtures/layer_out.psd",
  "_exports_to": "test/controls/layer_out_control.png"
}

因此,现在由我们来构建适当的测试工具来将JSON转换为适当的本机单元测试。我一直在使用MiniTest让自己加快速度,但我遇到了几个墙。

这是我到目前为止所得到的。测试工具暂时命名为TargetPractice

# run_target_practice.rb

require 'target_practice'

TargetPractice.new(:test) do |test|
  test.pattern = "test/**/*.json"
end

# psd_test.rb

class PSDTest < MiniTest::Unit::TestCase
  attr_accessor :data

  def tests_against_data
    # do some assertions
  end
end

# target_practice.rb

class TargetPractice
  attr_accessor :libs, :pattern

  def initialize(sym)
    @libs = []
    @pattern = ""

    yield self

    run_tests
  end

  def run_tests
     FileList[@pattern].to_a.each do |file|
       test_data = JSON.parse(File.open(file).read)
       test = PSDTest.new(test_data["_name"]) do |t|
         t.data = test_data
       end
     end
  end
end

很遗憾,我无法在yield中获得initialize来坚持我的PSDTest课程。此外,似乎测试将在初始化时立即运行。

我想动态创建一些MiniTest::Unit::TestCase个对象,设置适当的数据属性然后运行测试。任何指针都表示赞赏!

1 个答案:

答案 0 :(得分:1)

我认为你在这里过分复杂了。你需要的是一个parameterized test,使用mintest / spec实现起来非常简单:

describe "PSD converter" do
  def self.tests(pattern = 'test/**/*.json')
    FileList[pattern].map{|file| JSON.parse(File.read(file))}
  end

  tests.each do |test|
    it "satisfies test: " + test["_name"] do
      # some assertions using test["_file"] and test["_exports_to"]
    end
  end
end