在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