Модульное тестирование модуля, включенного в модели ActiveRecord - PullRequest
4 голосов
/ 12 июля 2011

У меня есть такой модуль (но более сложный):

module Aliasable 
  def self.included(base)
    base.has_many :aliases, :as => :aliasable
  end
end

, который я включаю в несколько моделей.В настоящее время для тестирования я делаю другой модуль, как показано ниже, который я просто включаю в тестовый пример

module AliasableTest 
  def self.included(base)
    base.class_exec do 
      should have_many(:aliases)
    end
  end
end

Вопрос в том, как мне провести тестирование этого модуля изолированно?Или вышеуказанный способ достаточно хорош.Похоже, что есть лучший способ сделать это.

1 Ответ

8 голосов
/ 12 июля 2011

Во-первых, self.included - это не хороший способ описать ваши модули, а class_exec - это ненужное усложнение. Вместо этого вы должны extend ActiveSupport::Concern, как в:

module Phoneable
  extend ActiveSupport::Concern

  included do
    has_one :phone_number
    validates_uniqueness_of :phone_number
  end
end

Вы не упомянули, какую тестовую среду вы используете, но RSpec охватывает именно этот случай. Попробуйте это:

shared_examples_for "a Phoneable" do
  it "should have a phone number" do
    subject.should respond_to :phone_number
  end
end

Предположим, что ваши модели выглядят так:

class Person              class Business
  include Phoneable         include Phoneable
end                       end

Затем в своих тестах вы можете выполнить:

describe Person do
  it_behaves_like "a Phoneable"      # reuse Phoneable tests

  it "should have a full name" do
    subject.full_name.should == "Bob Smith"
  end
end

describe Business do
  it_behaves_like "a Phoneable"      # reuse Phoneable tests

  it "should have a ten-digit tax ID" do
    subject.tax_id.should == "123-456-7890"
  end
end
...