在rspec文档中指出,我应该使用double
方法来创建测试双。 但是我可以看到,即使我不使用double
,它也能正常工作。没有使用double
有什么问题吗?另外,如果我不使用双如何MyClass
得到stub
和其他rspec方法?它们在rspec中运行时是否可用于所有对象?rspec中的double方法是什么?
require 'spec_helper'
class MyClass
def self.run
new.execute
end
def execute
'foo'
end
end
describe MyClass do
it 'should stub instance method' do
obj = MyClass.new
obj.stub(:execute).and_return('bar')
obj.execute.should == 'bar'
end
it 'should stub class method' do
MyClass.stub(:run).and_return('baz')
MyClass.run.should == 'baz'
end
end
其实当你在看我的例子,第一个规范存根**实例方法**,第二个存根**类方法**。它看起来像两个工作正常,没有使用'双'之前使用。这就是为什么我想知道什么是一个额外的'双'给我的魔法。 – grafthez 2013-03-06 17:45:00
看看我创建的https://gist.github.com/anonymous/5101448这个例子。如果我想测试'SchedulerJob',我需要存根'RequestSchedule'并模拟'RequestToQueuePusher'吗?另外困扰我的是'SchedulerJob'与两个剩余的类紧密结合。当我来自Java世界时,我通常会将它们作为依赖项提取,因为没有简单的方法来伪造以硬编码方式创建的对象。在Ruby中,它似乎不是一个问题。我看到很多像“SchedulerJob”这样的对象。我知道有一种方法可以很容易地伪装它们,但对我来说,这违反了一些固体原理 – grafthez 2013-03-06 18:06:15
这也是Ruby世界中糟糕的设计。应该有一种方法来注入RequestSchedule依赖关系,以便于测试。你可以这样做:'fakeschedule = double(RequestSchedule); RequestSchedule.stub(新).and_return(fakeschedule);'。它当然应该重构。 – 2013-03-06 18:42:00