0

我有一个有趣的难题。我正在开发一个库来解析 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对象,设置它们适当的数据属性,然后运行测试。任何指针表示赞赏!

4

1 回答 1

1

我认为你在这里有点过于复杂了。你需要的是一个参数化的测试,使用 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
于 2012-04-06T14:06:19.830 回答