Повторное использование юнит-тестов для моделей с использованием STI - PullRequest
0 голосов
/ 21 марта 2010

У меня есть несколько моделей, которые используют 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

Как мне использовать тест test_word_count для модели OtherList. Тест намного дольше, поэтому я бы предпочел не перепечатывать его для каждой модели. Спасибо.

РЕДАКТИРОВАТЬ: Я пытаюсь использовать миксин в соответствии с предложением Рэнди. Это то, что у меня есть, но я получаю сообщение об ошибке: «В объекте не пропущена постоянная ListTestMethods! (ArgumentError)»:

в lib / list_test_methods.rb:

module ListTestMethods
  fixtures :lists

  def test_word_count 
    ...
  end
end

в normal_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 Ответ

1 голос
/ 21 марта 2010

У меня действительно была похожая проблема, и я использовал миксин для ее решения.

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 не поддерживает абстрактные базовые классы, он не так чист от решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...