如何在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
答案 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)
你能继承这个类,然后提供你自己的初始化吗?