我有许多使用STI的模型,我想使用相同的单元测试来测试每个模型。例如,我有:
class RegularList < List
class OtherList < List
class ListTest < ActiveSupport::TestCase
fixtures :lists
def test_word_count
list = lists(:regular_list)
assert_equal(0, list.count)
end
end
我如何对OtherList模型使用test_word_count测试。测试时间要长得多,所以我宁愿不必为每个模型重新键入它。感谢。
编辑:我正按照兰迪的建议尝试使用mixin。这就是我所得到的但是得到了错误:“对象不缺少常量ListTestMethods!(ArgumentError)”: lib / list_test_methods.rb中的:
module ListTestMethods
fixtures :lists
def test_word_count
...
end
end
在regular_list_test.rb中:
require File.dirname(__FILE__) + '/../test_helper'
class RegularListTest < ActiveSupport::TestCase
include ListTestMethods
protected
def list_type
return :regular_list
end
end
编辑:如果我将夹具调用放在RegularListTest中并将其从模块中删除,那么一切似乎都有效。
答案 0 :(得分:1)
我实际上遇到了类似的问题并使用了mixin来解决它。
module ListTestMethods
def test_word_count
# the list type method is implemented by the including class
list = lists(list_type)
assert_equal(0, list.count)
end
end
class RegularListTest < ActiveSupport::TestCase
fixtures :lists
include ::ListTestMethods
# Put any regular list specific tests here
protected
def list_type
return :regular_list
end
end
class OtherListTest < ActiveSupport::TestCase
fixtures :lists
include ::ListTestMethods
# Put any other list specific tests here
protected
def list_type
return :other_list
end
end
这里运作良好的是OtherListTest和RegularListTest能够彼此独立地增长。
潜在地,您也可以使用基类执行此操作,但由于Ruby不支持抽象基类,因此它不是一个简洁的解决方案。