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