тестирование модельного миксина в Rails 3.1 - PullRequest
1 голос
/ 01 октября 2011

Я обновляюсь до Rails 3.1, и у меня возникла проблема с тестированием модуля, который мы включили в несколько моделей ActiveRecord.Ранее мы использовали тестовую модель, например:

describe FundTransfer do

  class TestFundTransfer < ActiveRecord::Base
    include FundTransfer

    # stub db columns
    class << self
      def columns() FundReturn.columns; end
    end
  end

  subject { TestFundTransfer.new }

  it { should belong_to(:admin) }
  it { should belong_to(:bank_account) }

  it "is not valid without bank account and moneybookers account" do
    fund_transfer = TestFundTransfer.new
    fund_transfer.should_not be_valid
  end

(полная спецификация: https://gist.github.com/1255960)

Это ломается, потому что не находит таблицу. Я, вероятно, мог бы найти способчтобы заглушить столбцы (как мы делали раньше), но мой вопрос: есть ли у кого-нибудь опыт сделать это лучше? В этой форме мы не можем протестировать все, что связано с сохранением / загрузкой модели.

I 'Я думаю о следующих параметрах:

  • создать таблицу с загрязнением основной схемы
  • создать таблицу в тесте, прежде чем транзакция будет запущена
  • заглушки столбцов(не позволяет сохранять / находить)

Кто-нибудь имеет какой-либо опыт с этим или есть лучшая идея?

Примечание: Миксин задает belongs_to ассоциации, поэтому я не могу использовать ActiveModel модули для моей тестовой модели, это должна быть модель ActiveRecord.

Ответы [ 3 ]

2 голосов
/ 02 октября 2011

Это хороший вопрос, с которым я тоже боролся. Я склонен идти к другому решению. Хотя предполагается, что ваш модуль включен в класс, который наследуется от ActiveRecord::Base, это не является явным требованием. Поэтому я склонен создавать класс, который может включать этот класс.

Так что-то вроде этого:

  class TestFundTransfer
    cattr_accessor :belongs_to_relations

    def self.belongs_to(relation)
      @@belongs_to_relations ||= []
      @@belongs_to_relations << relation
    end 

    include FundTransfer
  end

  context "on included" do
    it "adds the correct belongs_to relations" do
      TestFundTransfer.belongs_to_relations.should == [:your_relations]
    end
  end

Конечно, это может стать сложным, но, с другой стороны, это очень явно, и зависимости очевидны. Во-вторых, не нужно делать поддельную магию, чтобы заставить ActiveRecord::Base работать.

Внутри замечательная_активная запись Я видел другой подход: они используют вспомогательные методы для создания фиктивных таблиц и классов (и удаляют таблицу после использования). В их случае им нужно проверить фактическое поведение активных записей, поэтому дополнительные мили действительно имеют смысл. Не уверен, что я использовал бы такой же подход в проекте rails.

0 голосов
/ 01 октября 2011

Мне удалось сдать тест:

# stub db columns
class << self
  def columns() FundReturn.columns; end
  def columns_hash() FundReturn.columns_hash; end
  def column_defaults() FundReturn.column_defaults; end
end

Но я бы хотел услышать, есть ли у кого-нибудь лучшее решение.

0 голосов
/ 01 октября 2011

Помогает ли объявить класс abstract ?

class TestFundTransfer < ActiveRecord::Base
  include FundTransfer
  def self.abstract_class?; true; end
end
...