Дразнить метод инициализации в классе ruby? - PullRequest
2 голосов
/ 16 сентября 2010

Как я могу смоделировать метод initialize для класса ruby?

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

Я пытался написать несколько вещей, и ни одна из них, казалось, не заставила класс ложно возвращаться после нового вызова.Он просто продолжает возвращать обычный ожидаемый объект.

РЕДАКТИРОВАТЬ:

одна попытка -

class MockReminderTimingInfoParser < ReminderTimingInfoParser
  def new(blank)
    ReminderTimingInfoParserForTest.new
  end
end

describe ReminderParser do
  parser = ReminderParser.new(MockReminderTimingInfoParser)

  it "should parse line into a Reminder" do
    parser.parse(" doesnt matter  \"message\"").should == Reminder.new('message', ReminderTimingInfo.new([DaysOfWeek.new([:sundays])], [1]))
  end
end

class ReminderTimingInfoParserForTest
  include TimingInfoParser

  def parse_section(section); [DaysOfWeek.new([:sundays]), 1] end

  def reminder_times_converter(times); times end
end

Ответы [ 2 ]

2 голосов
/ 16 сентября 2010
class MockReminderTimingInfoParser < ReminderTimingInfoParser
  def new(blank)
    ReminderTimingInfoParserForTest.new
  end
end

Здесь вы определяете метод с именем new для всех экземпляров класса MockReminderTimingInfoParser. В своем вопросе вы упоминаете, что хотите подключиться к созданию экземпляра. Однако в Ruby создание экземпляра не выполняется методами экземпляра. Очевидно, что это не может работать, так как для вызова метода экземпляра сначала нужно иметь экземпляр!

Вместо этого экземпляры создаются путем вызова фабричного метода (обычно называемого new) в классе.

Другими словами, чтобы создать экземпляр MockReminderTimingInfoParser, вы должны вызвать MockReminderTimingInfoParser.new, но вы определили метод MockReminderTimingInfoParser#new. Чтобы вызвать метод, который вы определили, вам нужно вызвать MockReminderTimingInfoParser.new.new.

Вам необходимо определить метод для одноэлементного класса MockReminderTimingInfoParser. Есть несколько способов сделать это. Одним из способов было бы просто подражать так, как вы бы вызывали метод:

def MockReminderTimingInfoParser.new(blank)
  ReminderTimingInfoParserForTest.new
end

Еще один откроет синглтон-класс MockReminderTimingInfoParser:

class << MockReminderTimingInfoParser
  def new(blank)
    ReminderTimingInfoParserForTest.new
  end
end

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

class MockReminderTimingInfoParser < ReminderTimingInfoParser
  def self.new(blank)
    ReminderTimingInfoParserForTest.new
  end
end
0 голосов
/ 16 сентября 2010

Не могли бы вы унаследовать класс и затем предоставить свою собственную инициализацию?

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