在ruby类上模拟initialize方法?

时间:2010-09-15 23:21:25

标签: ruby mocking

如何在ruby类上模拟initialize方法?

我正在进行一些测试,并希望模拟从新调用创建的对象。

我试着写了一些东西,但似乎没有一个让新模拟类从新调用返回。它只是不断返回正常的预期对象。

编辑:

一次尝试 -

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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

你能继承这个类,然后提供你自己的初始化吗?