对使用STI的模型重新使用单元测试

时间:2010-03-21 20:11:21

标签: ruby-on-rails unit-testing

我有许多使用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中并将其从模块中删除,那么一切似乎都有效。

1 个答案:

答案 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不支持抽象基类,因此它不是一个简洁的解决方案。