Как написать спецификации для этого публичного метода (используя RSpec)? - PullRequest
1 голос
/ 04 января 2012

Я написал следующий класс:

# This class is responsible for getting the data to create the sitemap
class City
  attr_accessor :country_version, :directory, :country_host, :locale

  def initialize(country_version, directory, country_host,locale)
    @country_version = country_version
    @directory = directory
    @country_host = country_host
    @locale = locale
  end

  def get_data
    ::City.find_each(:conditions => {:country_version_id => @country_version.id}) do |city|
      I18n.locale=(@locale)
      yield entry(city)
    end
  end

  private

  def entry(city)
    {
      :loc => ActionController::Integration::Session.new.url_for(
                  :controller => 'cities', 
                  :action => 'show', 
                  :city_name => city.name, 
                  :host => @country_host.value),
      :changefreq => 0.8,
      :priority => 'monthly',
      :lastmod => city.updated_at
    }
  end
end 

Я использую RSpec для написания спецификаций для этого класса.Мои спецификации пока охватывают методы доступа и конструктор.Однако я теряюсь, когда дело доходит до более сложного метода get_data.Может кто-нибудь дать мне несколько советов, как я могу решить проблему написания спецификации для этого метода?

Ответы [ 2 ]

2 голосов
/ 04 января 2012

Несомненно, что простой тест будет выглядеть следующим образом:

  • Разрушается ли он при создании экземпляра?
  • Возвращает ли он данные при наличии хороших аргументов?
  • Возвращает ли я то, что я ожидаю (ноль / ноль / исключение?), Если даны неверные аргументы или те, которые не дают результатов?

Какой-то код:

describe :City do
  let(:country_version) { 123412 }
  # other useful args here
  context "On instantiation" do
    context "Given valid arguments" do
      subject { City.new country_version, ...}
      it { should_not be_nil }
      it { should be_a_kind_of City }
    end
  end
  end
  context "Given a country version id" do
    context "that is valid" do
      context "and records exist for in the datastore"
        let(:city) { City.new country_version, ...}
        subject { city.get_data }
        it { should_not be_nil } 
        it { should be_a_kind_of... (Array, Hash?) }
        it { should include( ...? }
      end
    end
  end
end

Очевидно,это не сработает, так как я понятия не имею, что должно входить и выходить, но дает вам кое-что для продолжения, а также подразумевает некоторые из отсутствующих спецификаций (например, недопустимые аргументы и т. д.)

См. https://www.relishapp.com/rspec/rspec-expectations для получения дополнительной информации.

Некоторые комментарии здесь также верны, вам, вероятно, понадобятся насмешки в какой-то момент, и вам, вероятно, все равно нужно реорганизовать этот метод, так что публикацияна форум по стилю кода тоже может быть идея.

0 голосов
/ 04 января 2012

Это очень многословно, ваш единственный действительный метод здесь - get_data.Вы можете использовать:

class City < Struct(:country_version, :directory, :country_host, :locale)
  ...
end

Чтобы получить аксессоры, конструкторы и немного больше бесплатно и не тестировать их (см. Struct )

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